Какова была конструктивная (или техническая) причина для Perl не локализует автоматически $ _
со следующим синтаксисом:
while (<HANDLE>) {...}
который переписывается как:
while (defined( $_ = <HANDLE> )) {...}
Все другие конструкции, которые неявно записывают в $ _
, делают это в локализованном способом ( для / foreach
, map
, grep
), но с , а
, вы должны явно локализовать переменную:
local $_;
while (<HANDLE>) {...}
Я предполагаю, что это как-то связано с использованием Perl в режиме "Super-AWK" с переключателями командной строки, но это может быть неверно.
Итак, если кто-то знает (или, что еще лучше, участвовал в разработке языка) обсуждение), не могли бы вы поделиться с нами причинами такого поведения? В частности, почему значение $ _
сохранялось за пределами цикла, который считался важным, несмотря на ошибки, которые он мог вызвать (которые я обычно вижу повсюду в SO и другом коде Perl) ?
В случае, если из вышеизложенного не ясно, почему $ _
необходимо локализовать с помощью , а
показано в этом примере:
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
}