7

この知恵は、2000 年のチャット ボードで引用された PerlFaq で見つけました。

glob() にリーク/バグはありますか?

一部のオペレーティング システムでの現在の実装により、スカラー コンテキストで glob() 関数またはその山かっこエイリアスを使用すると、リークや予期しない動作が発生する可能性があります。したがって、glob() はリスト コンテキストでのみ使用することをお勧めします。

この問題は Perl 5.6 で修正されたと読みましたが、5.10.1 でもまだ発生しているという報告を後で聞きました。

最近の問題を経験した人はいますか?これに関する決定的な答えを見つけるのに最適な場所はどこですか?

[後で..] 最新の PerlFAQ は次のように述べています。

5.18: glob() にリーク/バグはありますか?

(ブライアン・フォイによる寄稿)

Perl 5.6.0 から、"glob" は外部リソースに依存するのではなく、内部的に実装されています。そのため、"glob" に関するメモリの問題は、最新の perl では問題になりません。

=====

最後に: 報告された問題は、一致したすべての項目が既に与えられた後で、ループ内で glob を使用することによる glob の誤用によるものでした。問題ありませんでした。

4

2 に答える 2

5

Source Luke とコミット履歴を使用する

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

ここで再開するにbufferは、呼び出し元のスコープ外であっても、glob はフラッシュされません。

perl 5.22-1では、両方のケースが期待どおりに機能します (スカラー コンテキスト)。

于 2016-05-21T19:24:04.750 に答える