Согласно документации 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 должен находиться за пределами тестового каталога, иначе вы увидите имя файла сценария в выходных данных.
Я что-то здесь не так делаю или это так должно работать?