根据Perl关于文件遍历的文档,在标量上下文中使用<*>运算符或glob()函数时,应遍历与指定模式匹配的文件列表,每次调用时返回下一个文件名,或者没有更多文件时,请使用undef。
但是,迭代过程似乎只能在一个循环内进行。如果它不在循环中,那么它似乎在读取所有值之前立即重新开始。
从Perl文档中:
In scalar context, glob iterates through such filename expansions, returning undef when the list is exhausted.
http://perldoc.perl.org/functions/glob.html
However, in scalar context the operator returns the next value each time it's called, or undef when the list has run out.
http://perldoc.perl.org/perlop.html#I/O-Operators
示例代码:
使用警告;
使用严格
我的$ filename;
#在标量上下文中,<*>应该返回下一个文件名
#列表用完时每次调用或undef
$ filename = <*>;
打印“$ filename\n”;
$ filename = <*>; #不能按说明工作,请重新开始,然后
打印“$ filename\n”; #始终返回相同的文件名
$ filename = <*>;
打印“$ filename\n”;
打印“\n”;
当$ filename = <*>时打印“$ filename\n”; #循环工作,返回下一个文件
#每次被调用
在包含3个文件... file1.txt,file2.txt和file3.txt的目录中,以上代码将输出:
file1.txt
file1.txt
file1.txt
file1.txt
file2.txt
file3.txt
注意:实际的perl脚本应该在测试目录之外,否则您将在输出中看到该脚本的文件名。
我是在这里做错什么,还是应该这样工作?
最佳答案
这是一种将<>
glob运算符状态的魔力捕获到一个对象中的方法,该对象可以通过常规方式进行操作:匿名子(和/或闭包)!
sub all_files {
return sub { scalar <*> };
}
my $iter = all_files();
print $iter->(), "\n";
print $iter->(), "\n";
print $iter->(), "\n";
也许:
sub dir_iterator {
my $dir = shift;
return sub { scalar glob("$dir/*") };
}
my $iter = dir_iterator("/etc");
print $iter->(), "\n";
print $iter->(), "\n";
print $iter->(), "\n";
然后,我的倾向是将此文件归类为“好奇心”。忽略
glob()
/<>
的这种特殊奇怪性,改用opendir
/readdir
,IO::All/readdir
或File::Glob代替:)
关于perl - 为什么在标量上下文中Perl文件glob()无法在循环外工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2633447/