В соответствии с документацией Perl по файловому расширению, < * > оператор или glob(), при использовании в скалярном контексте, должен перебирать список файлов, соответствующих указанному шаблону, возвращая следующее имя файла при каждом вызове или undef, когда файлов больше нет.
Но процесс итерации, похоже, работает только внутри цикла. Если он не находится в цикле, то он, кажется, начинается сразу перед тем, как все значения будут прочитаны.
Из документов Perl:
В скалярном контексте glob выполняет итерацию через такие расширения имен файлов, возвращая undef, когда список исчерпан.
http://perldoc.perl.org/functions/glob.html
Однако в скалярном контексте оператор возвращает каждое значение при каждом вызове или undef, когда список заканчивается.
http://perldoc.perl.org/perlop.html#I/O-Operators
Пример кода:
use warnings; use strict; my $filename; # in scalar context, <*> should return the next file name # each time it is called or undef when the list has run out $filename = <*>; print "$filename\n"; $filename = <*>; # doesn't work as documented, starts over and print "$filename\n"; # always returns the same file name $filename = <*>; print "$filename\n"; print "\n"; print "$filename\n" while $filename = <*>; # works in a loop, returns next file # each time it is called
В каталоге с 3 файлами... file1.txt, file2.txt и file3.txt выведенный выше код:
file1.txt file1.txt file1.txt file1.txt file2.txt file3.txt
Примечание. Фактический perl script должен находиться за пределами тестового каталога, или вы увидите имя файла script на выходе.
Я делаю что-то неправильно здесь, или это то, как он должен работать?