По какой причине (или по техническим причинам) Perl не локализовал $_
автоматически со следующим синтаксисом:
while (<HANDLE>) {...}
, который переписывается как:
while (defined( $_ = <HANDLE> )) {...}
Вседругие конструкции, которые неявно записывают в $_
, делают это локализованным способом (for/foreach
, map
, grep
), но с while
вы должны явно локализовать переменную:
local $_;
while (<HANDLE>) {...}
Я предполагаю, что это как-то связано с использованием Perl в режиме «Super-AWK» с переключателями командной строки, но это может быть неправильно.
Так что, если кто-нибудь знает (или, что еще лучше, участвовал вобсуждение языкового дизайна), не могли бы вы поделиться с нами причинами такого поведения?Более конкретно, почему было позволено сохранять значение $_
вне цикла, которое считается важным, несмотря на ошибки, которые оно может вызывать (что я обычно вижу повсюду в SO и в другом коде Perl)?
В случае, если из приведенного выше не ясно, причина, по которой $_
должен быть локализован с while
, показана в этом примере:
sub read_handle {
while (<HANDLE>) { ... }
}
for (1 .. 10) {
print "$_: \n"; # works, prints a number from 1 .. 10
read_handle;
print "done with $_\n"; # does not work, prints the last line read from
# HANDLE or undef if the file was finished
}