Saturday, July 25, 2009

Perl: особенности работы с хэшами

Для каждого хэша в скрипте существует единственый итератор, который совместно используется функциями each, keys и values. Он позволяет данным функциям отслеживать, где именно в хэше они находятся. Сброс итератора происходит автоматически, когда весь хэш прочитан или при вызове keys и values.

Типичный пример обхода хэша:
while (my ($key, $value) = each %hash) {
...
}


Если внутри цикла написать keys %hash, то цикл превратится в бесконечный (keys даже в void-контексте сбросит внутренний итератор хэша).

Вместо keys, кстати, можно написать Data::Dumper::Dumper(%hash) - эффект будет тот же. Поэтому, внутри цикла each не стоит вызывать какие-либо функции, которые так или иначе используют данный хэш.

No comments:

Post a Comment