2008-11-25 29 views
18

Tôi là một chút mới để Perl, nhưng đây là những gì tôi muốn làm:Làm thế nào tôi có thể tạo mảng đa chiều trong Perl?

my @array2d; 
while(<FILE>){ 
    push(@array2d[$i], $_); 
} 

Nó không biên dịch từ @array2d[$i] không phải là một mảng mà là một giá trị vô hướng.

Tôi nên khai báo @ array2d như một mảng mảng như thế nào?

Tất nhiên, tôi không biết mình có bao nhiêu hàng.

Trả lời

27

Để thực hiện một mảng của mảng, hay chính xác hơn một mảng của arrayrefs, hãy thử một cái gì đó như thế này:

my @array =(); 
foreach my $i (0 .. 10) { 
    foreach my $j (0 .. 10) { 
    push @{ $array[$i] }, $j; 
    } 
} 

Nó đẩy giá trị lên một arrayref dereferenced cho bạn. Bạn sẽ có thể truy cập vào một entry như thế này:

print $array[3][2]; 
+4

Bạn cũng có thể truy cập như $ array [3] [2] - mũi tên là không cần thiết giữa các chỉ số liên tiếp [n] hoặc {key} của cấu trúc dữ liệu đa cấp. – xdg

+0

Bạn nói đúng, cảm ơn thông tin. Tôi sẽ cập nhật câu trả lời để phản ánh điều đó. – gpojd

6

Hãy xem perlrefperldsc để xem cách tạo cấu trúc dữ liệu lồng nhau, như mảng mảng và băm băm. Rất hữu ích khi bạn đang làm Perl.

8

Thay đổi "đẩy" bạn dòng này:

push(@{$array2d[$i]}, $_); 

Bạn đang cơ bản làm cho $ array2d [$ i] một mảng bởi xung quanh nó bằng cách @ {} ... Sau đó bạn có thể đẩy các phần tử vào mảng tham chiếu mảng này.

+1

Giải thích tốt. Để làm rõ hơn, $ array2d [$ i] là một tham chiếu mảng. Trong @ {$ array2d [$ i]}, khối {} trả về tham chiếu mảng và @ sigil dereferences nó như là một mảng. Tôi chỉ ra điều này để làm cho nó rõ ràng rằng các niềng răng là một khối trần, không phải là một thiết bị để lật đổ ưu tiên. – converter42

+0

Cảm ơn bạn đã làm rõ lời giải thích của tôi - Tôi biết rằng nó đã hoạt động, nhưng tôi không bao giờ biết lý do kỹ thuật đằng sau nó. Cảm ơn! – BrianH

+0

Không, chúng là một khối dereferencing, không phải là một khối trần. Trong perl -wle '{1 if @ {; last}; in "in"} in "out", cuối cùng nhìn thấy bên ngoài, thực sự trần khối, không phải là khối bên trong. – ysth

0

Một cách đơn giản là sử dụng một bảng băm và sử dụng hai chỉ số mảng để tạo ra một chìa khóa băm:

$two_dimensional_array{"$i $j"} = $val; 
+0

Có một số đường cú pháp cổ đại cho điều đó: http://perldoc.perl.org/perldata.html # Multi-dimensional-array-thi đua - vì vậy bạn chỉ có thể làm '$ hai_dim_array {$ i, $ j} = $ val' –

3

Có thực sự không có sự khác biệt giữa những gì bạn đã viết và điều này:

@{$array2d[$i]} = <FILE>; 

Tôi chỉ có thể giả sử bạn đang lặp qua các tệp.

Để tránh việc theo dõi một bộ đếm, bạn có thể làm điều này:

... 
push @array2d, [ <FILE> ]; 
... 

Điều đó nói 1) tạo ra một tham chiếu đến một mảng trống rỗng, 2) lưu trữ tất cả các dòng trong FILE, 3) đẩy nó lên @array2d .

+0

Tôi thấy cú pháp này thực sự tuyệt vời. Giải pháp tốt. –

0

Nếu bạn chỉ cố gắng để lưu trữ một tập tin trong một mảng bạn cũng có thể làm điều này:

fopen(FILE,"<somefile.txt"); 
@array = <FILE>; 
close (FILE); 
Các vấn đề liên quan