Rob*_*Rob 10 perl glob perl5.10
根据文件globbing的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脚本应该在test目录之外,或者你也会在输出中看到脚本的文件名.
我在这里做错了什么,或者它是如何工作的?
这是一种将<>
glob运算符状态的魔力捕获到一个对象中的方法,您可以按照正常的方式进行操作:匿名子(和/或闭包)!
sub all_files {
return sub { scalar <*> };
}
my $iter = all_files();
print $iter->(), "\n";
print $iter->(), "\n";
print $iter->(), "\n";
Run Code Online (Sandbox Code Playgroud)
也许:
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";
Run Code Online (Sandbox Code Playgroud)
然后我再次倾向于在"好奇心"下提出这个问题.忽略glob()
/的特殊奇怪性,<>
并使用opendir
/ readdir
,IO :: All/readdir
或File :: Glob代替:)
以下代码似乎也创建了2个独立的迭代器实例......
for ( 1..3 ) { $filename = <*>; print "$filename\n" if defined $filename; $filename = <*>; print "$filename\n" if defined $filename; }
我想我看到那里的逻辑,但它与文档有点直观和矛盾.文档没有提到必须处于循环中以使迭代工作的任何事情.