Каков самый безопасный способ перебора ключей хеша Perl?

Одна вещь, о которой вы должны hash знать при использовании each, это hashes то, что он побочный эффект hashing добавления «состояния» к perl5 вашему хэшу (хэш должен помнить что .each такое «следующий» ключ). При digest использовании кода, подобного hashing приведенным выше фрагментам, которые hashing перебирают весь хэш за один hash раз, обычно это не проблема. Тем perl5 не менее, вы столкнетесь perl5 с трудно отследимыми проблемами string-hashing (я говорю из опыт ;), при iteration использовании each вместе с такими hashing утверждениями, как last или return для perl5 выхода из цикла while ... each до того, как hashes вы обработали все ключи.

В iteration этом случае хеш запомнит, какие hash ключи он уже вернул, и когда perl5 вы используете each на нем в iterative следующий раз (возможно, в perl совершенно не связанном фрагменте код), он hashing будет продолжаться в этой .each позиции.

Пример:

my %hash = ( foo => 1, bar => 2, baz => 3, quux => 4 );

# find key 'baz'
while ( my ($k, $v) = each %hash ) {
    print "found key $k\n";
    last if $k eq 'baz'; # found it!
}

# later ...

print "the hash contains:\n";

# iterate over all keys:
while ( my ($k, $v) = each %hash ) {
    print "$k => $v\n";
}

Это печатает:

found key bar
found key baz
the hash contains:
quux => 4
foo => 1

Что .each случилось с клавишами "бар" и .each "баз"? Они все еще там, но второй digest each начинается там, где остановился digest первый, и останавливается, когда hash достигает конца хеша, поэтому hashalgorithm мы никогда не видим их во hashalgorithm втором цикле.

perl

hash

iteration

each

2022-07-17T01:46:58+00:00