perl - 为什么在标量上下文中Perl文件glob()无法在循环外工作?

标签 perl glob perl5.10

根据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/readdirIO::All/readdirFile::Glob代替:)

关于perl - 为什么在标量上下文中Perl文件glob()无法在循环外工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2633447/

相关文章:

regex - 为什么即使 $foo 匹配模式, `return $foo if/pattern/;` 也不返回 $foo?

regex - 如何修复 'Possible unintended interpolation of $\in regex'?

perl - 更改 DBIx 类结果类的继承树?

perl - 在 Perl 子例程中使用 @_ 时获取错误的参数值

hash - 使用 "each"迭代哈希时添加新成员

python - 使用一个 glob.glob 而不是多个 glob.glob

c++ - 使用 boost 的 Glob 风格正则表达式模式匹配

python - Glob 不打印结果

perl - 在 Perl 中,一个值可以未初始化但仍被定义吗?

regex - 将俄语单词的边框与\b匹配