【发布时间】:2017-12-04 23:27:59
【问题描述】:
以下摘录代码在 perl 5.16.3 和更早的版本上运行时有一个奇怪的行为,其中在行输入运算符中对 glob 的后续调用导致 glob 继续返回以前的值,而不是重新运行 glob .
#!/usr/bin/env perl
use strict;
use warnings;
my @dirs = ("/tmp/foo", "/tmp/bar");
foreach my $dir (@dirs) {
my $count = 0;
my $glob = "*";
print "Processing $glob in $dir\n";
while (<$dir/$glob>) {
print "Processing file $_\n";
$count++;
last if $count > 0;
}
}
如果您将两个文件放在 /tmp/foo 中,并将一个或多个文件放在 /tmp/bar 中,然后运行代码,我会得到以下输出:
在 /tmp/foo 中处理 *
处理文件/tmp/foo/foo.1
在 /tmp/bar 中处理 *
处理文件/tmp/foo/foo.2
我认为当while 在last 之后终止时,在第二次迭代中对while 的新调用将重新运行 glob 并给我列出的文件 /tmp/bar ,但我得到了 /tmp/foo 中内容的延续。
这几乎就像角度运算符 glob 的行为类似于预编译模式。我的假设是角度运算符正在符号表中创建一个文件句柄,该文件句柄仍处于打开状态并在后台被重用,并且它的范围为包含foreach,或者可能是整个子例程。
【问题讨论】:
-
在 cmets 进入之前,是的,如果我删除角度运算符 glob 并通过显式调用 glob() 和 foreach 来运行它,我将得到我期望的行为。我想知道为什么会这样,而不是如何解决它。
-
Re "在行输入运算符中对 glob 的后续调用导致 glob 继续返回以前的值",显然应该如此。如果
<$dir/$glob>总是返回第一个文件,那就没用了。