2010-10-14 2 views
1

Я еще раз забыл, как получить $_ для представления массива, когда он находится в цикле двухмерного массива.Как извлечь массив из двумерного массива в Perl?

foreach(@TWO_DIM_ARRAY){ 
    my @ARRAY = $_; 
} 

Это намерение, но это не работает. Каков правильный способ сделать это?

+0

Можете ли вы показать данные, которые вы начинаете с и что вы хотите, чтобы в конечном итоге, даже если в псевдокоде? –

ответ

5

Линия my @ARRAY = @$_; (вместо = $_;) является то, что вы но если вы явно не захотите сделать копию массива, на который ссылаетесь, я бы использовал @ $ _ напрямую.

Ну, на самом деле я бы не использовать $_ вообще, тем более, что вы, вероятно, хотите перебрать @$_, а затем использовать неявное $_ во внутреннем цикле тоже, и тогда вы могли бы иметь беспорядок, выясняя который $_ есть, или если это даже законно. Возможно, именно поэтому вы сначала копировали в @ARRAY.

Во всяком случае, вот что я хотел бы сделать:

for my $array_ref (@TWO_DIM_ARRAY) { 

    # You can iterate through the array: 
    for my $element (@$array_ref) { 
     # do whatever to $element 
    } 

    # Or you can access the array directly using arrow notation: 
    $array_ref->[0] = 1; 
} 
+1

+1 для синтаксиса my $ var. Похоже, что многие люди не беспокоятся об этом, хотя это улучшает читаемость довольно много. – Sorpigal

+0

Тем не менее, почему это не работает: foreach (@TWO_DIM_ARRAY) {print join ',', @ {$ _}; } В конце концов, $ _ является ссылкой на массив, а @ {$ _} должен быть массивом. –

+0

@ Майкл Голдштейн: Это тоже сработает. '@ {$ _}' совпадает с '@ $ _'. Например, я просто попробовал это: 'my @A = ([1,2,3], [4,5,6], [7,8,9]); foreach (@A) {print join (",", @ {$ _}), "\ n"; } ' – Jander

4

$_ будет массив ссылки (не массивы), так что вам нужно разыменования его как:

my @ARRAY = @$_; 
Смежные вопросы