Существует проблема с первоначально опубликованной подпрограммой.
Функция shift
ожидает массив в качестве аргумента.Неявная переменная внутри foreach
является скаляром.
Это означает, что $fh
остается неинициализированным.Причина, по которой это, вероятно, остается незамеченной, заключается в том, что (, как указывает Евгений y ), лексические файловые дескрипторы закрываются, когда выходят за рамки.
Кстати, use warnings;
будет уведомлять о таких вещах.
Более идиоматическим подходом было бы использование цикла while
:
sub closef {
while ( my $fh = shift @_ ) {
close $fh;
}
}
Для более компактной записи цикл for
- это путь:
sub closef { close for @_; }
Эквивалент с циклом while
не так читабелен:
sub closef { close while $_ = shift }
Обновление
Комментарий Майкла Кармана, приведенный ниже, остается в силе.shift
изменяет перебираемый массив, что делает его небезопасной операцией.На самом деле это проблема .