Perl: неожиданное поведение $ _ - PullRequest
7 голосов
/ 27 марта 2012
use Modern::Perl;
use DateTime;
use autodie;

my $dt;

open my $fh, '<', 'data.txt';

# get the first date from the file
while (<$fh> && !$dt) {
   if ( /^(\d+:\d+:\d+)/ ) {
      $dt = DateTime->new( ... );
   }
   print;
}

Я ожидал, что этот цикл будет читать каждую строку файла, пока не будет прочитано первое значение даты и времени.

Вместо этого $ _ унифицируется, и я получаю кучу сообщений «и неинициализированное значение $ _ в сопоставлении с образцом» (и в распечатке).

Есть идеи, почему это происходит?

A

1 Ответ

20 голосов
/ 27 марта 2012

$_ устанавливается, только если вы используете форму while (<$fh>), которой вы не являетесь.

Посмотрите на это:

$ cat t.pl
while (<$fh>) { }
while (<$fh> && !$dt) { }

$ perl -MO=Deparse t.pl
while (defined($_ = <$fh>)) {
    ();
}
while (<$fh> and not $dt) {
    ();
}
t.pl syntax OK

Из документов документов:

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

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