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

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目录之外,或者你也会在输出中看到脚本的文件名.

我在这里做错了什么,或者它是如何工作的?

hob*_*bbs 9

这是一种将<>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/readdirFile :: Glob代替:)


Rob*_*Rob 5

以下代码似乎也创建了2个独立的迭代器实例......

for ( 1..3 )
{
   $filename = <*>;
   print "$filename\n" if defined $filename;
   $filename = <*>;
   print "$filename\n" if defined $filename;
}

我想我看到那里的逻辑,但它与文档有点直观和矛盾.文档没有提到必须处于循环中以使迭代工作的任何事情.

  • +1伟大的实验.这类似于范围运算符(`..`)的行为,其中运算符的每次使用都保持其自己的状态.但是,如果我能在任何地方找到记录的话. (5认同)