gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:13:50 24 4
gpt4 key购买 nike

根据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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com