Другие ответы объяснили форму модификатора оператора цикла while
. Однако здесь есть много другой магии. В частности, сценарий основывается на трех специальных переменных Perl. Два из них ($_
и $!
) очень распространены; другой ($.
) достаточно распространен. Но они все знают.
Когда вы запускаете while <$fh>
на открытую файловую дескриптор, Perl автоматически проходит через файл по строкам, пока не достигнет EOF
. Внутри каждого цикла текущая строка устанавливается на $_
, если вы ничего не делаете. Таким образом, эти две такие же:
while (<$fh>) { # something }
while (defined($_ = <$fh>)) { # something }
См perldoc perlop
, в разделе операторов ввода/вывода. (Некоторые люди находят это слишком магическим, поэтому вместо этого они используют while (my $line = <$fh>)
.Это дает вам $line
для каждой строки, а не $_
, что является более ясным именем переменной, но для этого требуется больше ввода. Каждому принадлежит.)
$!
содержит значение системной ошибки (если установлено). См. Раздел perldoc perlvar
, раздел о $OS_ERROR
, чтобы узнать, как и когда его использовать.
$.
содержит номер строки. См. perldoc perlvar
, раздел на $NR
. Эта переменная может быть удивительно сложной. Он не обязательно будет содержать номер строки файла, который вы сейчас читаете. Пример:
#!/usr/bin/env perl
use strict;
use warnings;
while (<>) {
print "$ARGV: $.\n";
}
Если вы сохраните это как lines
и запустить его как perl lines file1 file2 file3
, то Perl будет считать строки прямо через file1, file2 и file3. Вы можете видеть, что Perl знает, какой файл он читает (он находится в $ ARGV, имена файлов будут правильными), но он не автоматически переводит нумерацию строк в конце каждого файла. Я упоминаю об этом, так как я немного походил на это поведение несколько раз, пока не получил его через мой (толстый) череп. Вы можете сбросить нумерацию для отслеживания отдельных файлов таким образом:
#!/usr/bin/env perl
use strict;
use warnings;
while (<>) {
print "$ARGV: $.\n";
}
continue {
close ARGV if eof;
}
Вы должны также проверить strict
и warnings
прагм и посмотреть на новой, три-аргументе форме open
. Я только заметил, что вы «unknown (google)», что означает, что вы, вероятно, никогда не вернетесь. Наверное, по крайней мере, у меня была практика набора текста на день.
Сколько лет этой книге? –
** 'WARNING' ** Не используйте этот код, он плохо написан. –
Ой, да, я даже не заметил, что он делает с файловым дескриптором. Это зло. – chaos