Разница между циклом while и единичным использованием оператора Diamond в Perl - PullRequest
5 голосов
/ 22 февраля 2012

Я запутался в следующем:

<>; print;

против

while(<>){print;}

Первый ничего не печатает, а второй печатает. Разве <> не всегда сохраняет введенные данные в $_?

Спасибо.

Ответы [ 3 ]

13 голосов
/ 22 февраля 2012

Итератор ввода алмазного файла является волшебным, только когда он находится в условном цикле while:

$ perl -MO=Deparse -e '<>; print;'
<ARGV>;
print $_;
-e syntax OK

$ perl -MO=Deparse -e 'while (<>) {print;}'
while (defined($_ = <ARGV>)) {
    print $_;
}
-e syntax OK

Все это задокументировано в perlop

8 голосов
/ 22 февраля 2012

Исключением является условие оператора 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-скрипте.) Переменная $ _ не является неявно локализованной.Вы должны будете поместить "местный $ _;"перед циклом, если вы хотите, чтобы это произошло.

2 голосов
/ 22 февраля 2012

С http://perldoc.perl.org/perlvar.html (Говоря о $ _):

"Место по умолчанию для ввода входной записи, когда результат операции сам по себе тестируется как единственный критерий теста while. Вне теста времени это не произойдет."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...