Почему <> не устанавливает $ _, а (<>) {} делает? - PullRequest
1 голос
/ 27 июля 2011
<>;
print $_

Но это работает:

while(<>){
  print $_;
}

Почему не работает первая версия?

Ответы [ 3 ]

10 голосов
/ 27 июля 2011

Поскольку while (<>) является сокращением для while(defined($_ = <ARGV>)), но <>; это просто <ARGV>;.Это можно увидеть с помощью модуля B::Deparse.

Учитывая файл example.pl

#!/usr/bin/perl

use strict;
use warnings;

<>;

while (<>) {
}

, команда

perl -MO=Deparse example.pl

будетprint

use warnings;
use strict 'refs';
<ARGV>;
while (defined($_ = <ARGV>)) {
    ();
}
example.pl syntax OK

Это пример знаменитого Perl DWIM ery.Я полагаю, что это было сделано, чтобы помешать людям делать расточительный

for (<>) {
}

Нет особого смысла в специальном корпусе <> в пустом контексте, и, на самом деле, это может быть вредно, так как, когда вы говорите1026 * вы чаще всего пытаетесь выбросить ненужную строку из дескриптора файла.$_ поймать это было бы неэффективно и не желательно.

3 голосов
/ 27 июля 2011

Оператор Perl while (<>) имеет неявное присвоение $_, которого нет в вашем первом фрагменте.

Это описано в man perlop :

Если и только если входной символ является единственным в условном выражении while (даже если он замаскирован как цикл for(;;)), значение автоматически присваивается глобальной переменной $ _, уничтожая все там ранее.

1 голос
/ 27 июля 2011

Поскольку второй случай является особым случаем, как если бы вы написали:

while (defined($_ = <>)) {

Первый случай не является особым случаем.Поскольку вы нигде не сохранили строку ввода, она не была сохранена.

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