2016-10-01 3 views
3

Это достаточно легко перебрать список:Perl: Можно ли перебирать анонимный хэш?

foreach my $elem (1, 2, 3, 4, 5) { 
    say $elem; 
} 

или анонимный массив:

foreach my $elem (@{[ 1, 2, 3, 4, 5 ]}) { 
    say $elem; 
} 

Но можно сделать то же самое для анонимного хэша? Я пробовал:

while (my ($key, $value) = each (%{{ a => 1, b => 2, c => 3 }})) { 
    say "$key=$value"; 
} 

но я получаю бесконечный цикл.

+4

Вопреки сказанному, в массиве 'foreach my $ elem (1, 2, 3, 4, 5) нет никакого массива { say $ elem; } ' – ikegami

ответ

12

Цикл foreach оценивает свое выражение один раз. while, с другой стороны, оценивает свое выражение после каждого прохода. Это означает, что вы неоднократно создаете новый хеш и захватываете свой первый элемент.

Вы можете сделать следующее:

use List::Util 1.29 qw(pairs); 

for my $pair (pairs %{ { a => 1, b => 2, c => 3 } }) { 
    my ($key, $val) = @$pair; 
    ... 
} 

Но так же, как ваш второй фрагментом является излишне расточительным и сложным вариантом первого фрагмента, то выше, является неоправданно расточителен и сложным вариантом из следующих:

use List::Util 1.29 qw(pairs); 

for my $pair (pairs a => 1, b => 2, c => 3) { 
    my ($key, $val) = @$pair; 
    ... 
} 
+0

Все, что вы видите неправильно с' foreach my $ key (keys% {...}) 'Нет необходимости' использовать' для 'ключей', правильно? – stevesliva

+1

@stevesliva. Если вы это сделаете, вы не сможете получить доступ к значениям. – ikegami

+0

Ха, да. Я не думал об итерационной части! О, конечно, вы хотите, чтобы ответ был * полезным *, тоже? – stevesliva

Смежные вопросы