Исключением является условие оператора while
.
$ perl -MO=Deparse -e 'while(<>) { print }'
while (defined($_ = <ARGV>)) {
print $_;
}
-e syntax OK
$ perl -MO=Deparse -e '<>; print'
<ARGV>;
print $_;
-e syntax OK
perlop
документирует, что автоматическое назначение $_
происходит только в этом контексте:
Обычно вы должны присвоить возвращаемое значение переменной, но есть одна ситуация, когда происходит автоматическое назначение.Если и только если входной символ является единственным в условном выражении while (даже если он замаскирован как цикл for (;;)), значение автоматически присваивается глобальной переменной $ _, уничтожая всебыл там ранее.(Это может показаться вам странным, но вы будете использовать конструкцию почти в каждом написанном вами Perl-скрипте.) Переменная $ _ не является неявно локализованной.Вы должны будете поместить "местный $ _;"перед циклом, если вы хотите, чтобы это произошло.