3

次のコードを実行すると、C:\Test 以下のすべてのファイルのファイル名が出力されます。印刷されないのはなぜですかHello(処理されるファイルの数に応じて n 回)。

shiftこれは、に確実に割り当てることができないことを意味し$_ますか? 同僚が関数を実装していて、それが必要なサブルーチンから呼び出されていることを知らないと想像しくださいwtf。このコードを Strawberry Perl 5.12 で実行しますFile::Find

編集:このコードも期待どおりに実行されません:

use strict;
use warnings;

wanted();

sub wanted{
    wtf("Hello");
}

sub wtf {
    shift;
    print; #expecting Hello 
}

これは明らかに File::Find とは何の関係もありません。現在、この質問の新しいタイトルを探しています。これが私の元のコードです:

use strict;
use warnings;

use File::Find;

find(\&wanted, "C:\\test");

sub wanted{
    wtf("Hello");
}

sub wtf {
    shift;
    print; #expecting Hello 
}
4

3 に答える 3

4

printデフォルトは印刷$_ですが、shiftデフォルトはシフト@_です。引数をサブルーチンに渡す場合は、を使用する必要があります。を使用する必要があり@_ます$_shiftシフトされた値を返すので、次のようにする必要があります。

sub wtf {
    my $_ = shift;
    print;
}

問題は、$_変数がファイル名に@_設定されているが、引数に設定されていることです。のCPANドキュメントFile::Findは、これについて詳しく説明しています。

于 2010-06-02T09:45:40.033 に答える
2

shiftに代入しません$_

于 2010-06-02T09:43:30.273 に答える
0

ところで、CPAN には File::Find のより良い代替品があります (例: File::Find::Rules または File::Find::Object)。File::Find は、実際にはコアに取り込まれたという事実によって石化された、昔からの一種の化石です。

于 2010-06-02T16:58:27.377 に答える