Почему в Perl конструкция `while () {…}` не локализует `$ _`?

Какова была конструктивная (или техническая) причина для 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
}
23
задан Eric Strom 31 March 2011 в 20:22
поделиться