Во-первых, массивы не могут быть undefined . Вы проверяете, является ли массив пустым . Чтобы понять, почему его опорожняют, вам нужно понять -n
. -n
окружает ваш код
LINE: while (<>) {
...
}
что сокращенно от
LINE: while (defined($_ = <ARGV>)) {
...
}
ARGV
- это магический дескриптор, который читает файлы, перечисленные в @ARGV
, смещая имена файлов по мере их открытия.
$ echo foo1 > foo
$ echo foo2 >>foo
$ echo bar1 > bar
$ echo bar2 >>bar
$ echo baz1 > baz
$ echo baz2 >>baz
$ perl -nlE'
BEGIN { say "Files to read: @ARGV" }
say "Read $_ from $ARGV. Files left to read: @ARGV";
' foo bar baz
Files to read: foo bar baz
Read foo1 from foo. Files left to read: bar baz
Read foo2 from foo. Files left to read: bar baz
Read bar1 from bar. Files left to read: baz
Read bar2 from bar. Files left to read: baz
Read baz1 from baz. Files left to read:
Read baz2 from baz. Files left to read:
Имейте в виду, что блоки BEGIN
выполняются сразу после их компиляции, поэтому <ARGV>
еще не был выполнен, когда выполняется блок BEGIN
(даже если он появился ранее в программе) , поэтому @ARGV
еще не был изменен.
-n
задокументировано в perlrun . ARGV
, @ARGV
и $ARGV
задокументированы в perlvar .