Другие ответы объяснили форму модификатора оператора цикла 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 будет считать строки прямо через файл1, файл2 и файл3. Вы можете видеть, что Perl знает, из какого файла он читает (он находится в $ ARGV; имена файлов будут правильными), но он не автоматически сбрасывает нумерацию строк в конце каждого файла. Я упоминаю об этом, так как меня это поведение кусало не раз, пока я наконец не получил его через свой (толстый) череп. Вы можете сбросить нумерацию для отслеживания отдельных файлов следующим образом:
#!/usr/bin/env perl
use strict;
use warnings;
while (<>) {
print "$ARGV: $.\n";
}
continue {
close ARGV if eof;
}
Вы также должны проверить strict
и warnings
прагм и взглянуть на более новую форму с тремя аргументами open
. Я только что заметил, что вы " unknown (google) ", что означает, что вы, вероятно, никогда не вернетесь. Думаю, я получил дневную практику по крайней мере за день.