2009-03-02 29 views
5

Tôi đã xem qua dòng mã sau đây. Nó có vấn đề:

  • nó được thiết kế để làm tương tự như push
  • nó nên đã sử dụng push
  • thật khó để đọc, hiểu
  • Tôi đã kể từ khi thay đổi nó để sử dụng push
  • nó một cái gì đó mà tôi nghĩ là bất hợp pháp, nhưng rõ ràng không phải là

ở đây là:

$array [++$#array] = 'data'; 

Câu hỏi của tôi là: làm thế nào để tăng thêm $ # mảng? Tôi luôn coi mảng $ # là thuộc tính của mảng và không thể ghi được.

+0

Cảm ơn đã sửa - đó là tiêu đề tôi nên đã viết. –

Trả lời

14

perldata nói:

"Chiều dài của một mảng là một giá trị vô hướng Bạn có thể tìm thấy chiều dài của @days mảng bằng cách đánh giá $ # ngày, như trong csh Tuy nhiên, đây không phải là chiều dài của.. mảng, nó là chỉ số của phần tử cuối cùng, đó là một giá trị khác vì thường có phần tử thứ 0. Việc gán cho $ # ngày thực sự thay đổi độ dài của mảng, rút ​​ngắn một mảng theo cách này phá hủy các giá trị xen kẽ. trước đây được rút ngắn không phục hồi các giá trị nằm trong các phần tử đó. "

Sửa đổi $ # mảng hữu ích trong một số trường hợp, nhưng trong trường hợp này, việc đẩy rõ ràng là tốt hơn.

+0

Một trong những trường hợp sẽ tốt hơn là khi bạn biết trước mảng của bạn sẽ lớn đến mức nào. Với mảng lớn này sẽ cung cấp cho bạn một tăng hiệu suất lớn. – innaM

+0

Trên các độ dài Perls cũ hơn bằng mảng $ #, sẽ lấy lại các giá trị trước đó. –

+0

Đó là perl4, tôi tin. – ysth

4

Gán giá trị lớn hơn chiều dài mảng hiện tại thành $#array mở rộng mảng.

+0

Tôi tin rằng liên kết là một bản sao trái phép của một cuốn sách. Tôi sẽ đề nghị bạn loại bỏ nó. – mirod

+0

Trên thực tế, liên kết đã chết, nhưng tôi đồng ý rằng đó là một ý tưởng tồi để liên kết đến sách lậu. – Telemachus

+0

Nó đã không chết khi tôi kiểm tra nó, và có rất nhiều cuốn sách khác nữa. – mirod

3

Mã này hoạt động quá:

$ perl -le 'my @a; $a[@a]="Hello"; $a[@a]=" world!"; print @a' 
Hello world! 

Perl mảng là năng động và phát triển khi gán vượt quá giới hạn.

+0

Tôi không thấy làm thế nào ++ $ # mảng sẽ không thay đổi nó. Tôi giả định rằng sau khi gán, mảng $ # được sửa đổi một lần nữa, có thể là cùng một giá trị. –

+0

Tôi nghĩ rằng '++ $ # array' là vô ích ở đây. –

+0

Bạn cần mảng ++ $ #, nếu bạn sử dụng mảng $ #, bạn sẽ chỉ ghi đè phần tử cuối cùng của mảng (hoặc nhận được 'Sửa đổi giá trị mảng không thể tạo được, lỗi subscript -1' nếu mảng đó là empty) – mirod

1

Trước hết, điều đó thật đáng tiếc.

Điều đó nói rằng, tôi cũng ngạc nhiên khi nó hoạt động. Tôi đã đoán rằng ++$#array có thể đã nhận được lỗi "Không thể sửa đổi liên tục" mà bạn nhận được khi cố gắng tăng số. (Không phải là tôi đã từng vô tình làm điều đó, tất nhiên.) Nhưng, tôi đoán đó là chính xác nơi chúng tôi đã sai: $#array không phải là một hằng số (một số); đó là một biểu thức biến. Như vậy bạn có thể gây rối với nó. Hãy xem xét những điều sau đây:

my @array = qw/1 2 3/; 

++$#array; 
$array[$#array] = qw/4/; 

print "@array\n" 

Và thậm chí, cho vui thêm, điều này:

my @array = qw/1 2 3/; 

$#array += 5; 

foreach my $wtf (@array) { 
    if (defined $wtf) { 
    print "$wtf\n"; 
    } 
    else { 
    print "undef\n"; 
    } 
} 

Và, yeah, các Perl Cookbook là hạnh phúc để gây rối với $#array để phát triển hoặc cắt ngắn mảng (Chương 4 , công thức 3). Tôi vẫn thấy nó xấu xí, nhưng có lẽ đó chỉ là một thành kiến ​​"nhưng đó là một con số".

+0

Tôi không chắc chắn về bạn nhưng * Tôi * nghĩ rằng nó xấu vì nó có 4 dấu chấm câu, không phải là dấu phân cách hoặc dấu ngoặc đơn, liên tiếp .... Ý tôi là, tôi cũng điều a = b + (foo? - $ # mảng: + $ # mảng); là xấu xí B-) –

+0

Tôi cũng rất ngạc nhiên khi nó hoạt động. –

4

Sau tăng sẽ trả về biến đầu tiên và sau đó tăng biến đó.

Nếu bạn sử dụng tăng sau, bạn sẽ sửa đổi phần tử cuối cùng, vì phần tử được trả về trước và sau đó đẩy phần tử trống vào cuối.Trong vòng lặp thứ hai, bạn sẽ sửa đổi giá trị rỗng đó và đẩy một giá trị rỗng mới cho sau này. Vì vậy, nó sẽ không hoạt động như một sự thúc đẩy nào cả.

Tiền gia tăng sẽ tăng biến và sau đó trả lại. Bằng cách đó, ví dụ của bạn sẽ luôn được viết cho một phần tử mới, cuối cùng của mảng và làm việc như push. Ví dụ dưới đây:

my (@pre, @post); 

$pre[$#pre++] = '1'; 
$pre[$#pre++] = '2'; 
$pre[$#pre++] = '3'; 


$post[++$#post] = '1'; 
$post[++$#post] = '2'; 
$post[++$#post] = '3'; 

print "pre keys: "[email protected]"\n"; 
print "pre: @pre\n"; 
print "post keys: "[email protected]"\n"; 
print "post: @post\n"; 

kết quả đầu ra:

pre keys: 3 
pre: 2 3 
post keys: 3 
post: 1 2 3 
+0

Giá trị "trả về" của toán tử tăng (s) là một sự phân biệt quan trọng, tôi rất vui vì có ai đó đã tạo ra nó. – jettero

+1

@pre = (2, 3, undef); –

Các vấn đề liên quan