7

我在 2000 年的聊天板上引用的 PerlFaq 中发现了这条智慧。

glob() 中是否存在泄漏/错误?

由于某些操作系统上的当前实现,当您在标量上下文中使用 glob() 函数或其尖括号别名时,可能会导致泄漏和/或不可预测的行为。因此最好只在列表上下文中使用 glob()。

我读到这个问题在 Perl 5.6 中已修复,但后来听到报告说它仍然出现在 5.10.1

有没有人对最近的问题有任何经验,在哪里可以找到有关此问题的明确答案?

[稍后..] 最新的 PerlFAQ 说:

5.18: glob() 中是否存在泄漏/错误?

(由布赖恩·d·福伊提供)

从 Perl 5.6.0 开始,“glob”在内部实现,而不是依赖于外部资源。因此,“glob”的内存问题在现代 perls 中不是问题。

=====

最后:被报告的问题是由于 glob 在已经给出所有匹配项之后在循环中使用它而误用了它。没有问题。

4

2 回答 2

5

使用源卢克和提交历史

http://perl5.git.perl.org/perl.git/history/HEAD:/ext/File-Glob

更新:虽然那个长期过时的 perlfaq5 项目在5.14中存在,但它在最新版本中消失了

于 2012-10-11T09:46:16.943 回答
1

我刚刚使用 Perl 5.14.2在Debian Wheezy上进行了测试。

标量上下文 - 惨遭失败

sub test
{
    my $dir = shift;
    my $oldDir = cwd();

    chdir($dir) or die("Could not chdir() : $!");
    my $firstEntry = glob('*');
    print "$firstEntry\n";
    chdir($oldDir) or die("Could not chdir() : $!");    
}

# /tmp/test1 (contains file1 and file2)
test('/tmp/test1); # Display file1 which is expected

# /tmp/test2 (contains file3 and file4)
test('/tmp/test2'); # Display file2 which is not expected

列出上下文(按预期工作)

sub test
{
    my $dir = shift;
    my $oldDir = cwd();

    chdir($dir) or die("Could not chdir() : $!");
    (my $firstEntry) = glob('*');
    print "$firstEntry\n";
    chdir($oldDir) or die("Could not chdir() : $!");    
}

# /tmp/test1 (contains file1 and file2)
test('/tmp/test1); # Display file1 which is expected

# /tmp/test2 (contains file3 and file4)
test('/tmp/test2'); # Display file3 which is expected

要在这里恢复,globbuffer不会被刷新,即使我们超出了调用者范围。

使用 perl 5.22-1,两种情况都按预期工作(标量上下文)。

于 2016-05-21T19:24:04.750 回答