четверг, 29 октября 2009 г.

each и return - опасное соседство


keys %foo;
while (my ($k, $v) = each %foo) {
...
return ...;
}

Для вышеприведенного кода, если while вызывается более чем один раз за время существования хеша %foo, не следует забывать о сбросе итератора each при помощи keys.

Я вот забыл, так как практически не использую each, и потратил время на поиски причины, почему код выдает неверный результат. Хорошо, что сразу написал тест и увидел, что есть ошибка.

1 комментарий:

OlegTar комментирует...

Для сброса хэша есть функция reset:
reset %hash;

думаю, что "reset" надёжней, чем "keys", потому что "reset" как раз и предназначена для сброса.

Вполне возможно, что в следующих версиях "keys" не будет сбрасывать