2012-12-24 34 views
6

Tôi có một mảng, @allinfogoals và tôi muốn biến mảng này thành một mảng đa chiều. Để cố gắng thực hiện điều này, tôi đang cố gắng đẩy một mảng như một mục như vậy:Đẩy mảng như một mục vào mảng khác - không tạo mảng đa chiều

push @allinfogoals, ($tempcomponents[0], $tempcomponents[1], $singlehometeam); 

Nơi các mục đó trong ngoặc đơn là tất cả các chuỗi riêng lẻ mà tôi đã có trước đó. Tuy nhiên, nếu tôi tham khảo $allinfogoals[0], tôi nhận được giá trị của $tempcomponents[0] và nếu tôi cố gắng $allinfogoals[0][0] tôi nhận được:

Can't use string ("val of $tempcomponents[0]") as an ARRAY ref while "strict refs" in use 

Làm thế nào tôi có thể thêm các mảng để @allinfogoals để làm cho nó một mảng đa chiều?

Trả lời

15

Trước hết, các dấu ngoặc trong

push @allinfogoals, ($tempcomponents[0], $tempcomponents[1], $singlehometeam); 

chẳng làm gì cả. Đó chỉ là một cách viết kỳ lạ:

push(@allinfogoals, $tempcomponents[0], $tempcomponents[1], $singlehometeam); 

Ưu tiên thay đổi của Parens; họ không tạo danh sách hoặc mảng.


Bây giờ cho câu hỏi của bạn. Không có thứ gì như một mảng 2d trong Perl, và các mảng chỉ có thể giữ vô hướng. Giải pháp là tạo ra một mảng các tham chiếu đến các mảng khác. Đó là lý do

$allinfogoals[0][0] 

là viết tắt của

$allinfogoals[0]->[0] 
    aka 
${ $allinfogoals[0] }[0] 

Như vậy, bạn cần lưu trữ giá trị của bạn trong một mảng và đặt một tham chiếu đến mảng trong mảng cấp cao nhất.

my @tmp = (@tempcomponents[0,1], $singlehometeam); 
push @allinfogoals, \@tmp; 

Nhưng Perl cung cấp toán tử đơn giản hóa điều đó cho bạn.

push @allinfogoals, [ @tempcomponents[0,1], $singlehometeam ]; 
3

Không chắc chắn chính xác lý do tại sao các công trình này, nhưng nó ...

push (@{$allinfogoals[$i]}, ($tempcomponents[0], $tempcomponents[1], $singlehometeam)); 

cần thiết để tạo ra một iterator, $i để làm điều này.


Theo @ikegami, điều sau là lý do.

Đó chỉ hoạt động nếu $allinfogoals[$i] không được xác định, khi đó là một cách kỳ lạ viết

@{$allinfogoals[$i]} = ($tempcomponents[0], $tempcomponents[1], $singlehometeam); 

trong đó sử dụng autovivification để làm tương đương với

$allinfogoals[$i] = [ $tempcomponents[0], $tempcomponents[1], $singlehometeam ]; 

mà có thể đạt được mà không $i sử dụng

push @allinfogoals, [ $tempcomponents[0], $tempcomponents[1], $singlehometeam ]; 

Snip cuối cùng này thú cưng được giải thích chi tiết trong câu trả lời của tôi.

+3

Điều này có thể giải thích lý do tại sao hoạt động ... http: //perldoc.perl.org/perlreftut.html – squiguy