2010-06-02 34 views
3

運行以下代碼時,將打印C:\ Test下面所有文件的文件名。爲什麼不打印Hello(n次,取決於處理的文件數量)?

這是否意味着我不能依靠shift來可靠地分配給$_?設想一個同事實現wtf功能,並不知道它是從File::Find想要分。 我運行此代碼與草莓的Perl 5.12

編輯:此代碼不會按預期運行或者:

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 
} 
+0

嘗試perldoc -f shift - 它讓你認爲shift指定給$ _? – reinierpost 2010-06-02 17:02:20

+0

我不知道。我只是想到了這一點:換班;打印; – zedoo 2010-06-02 17:35:06

回答

4

print默認爲打印$_,但shift默認爲轉移@_。如果你想獲得傳遞給子程序的參數,你應該使用@_,而不是$_shift返回轉向值,所以你應該做的是這樣的:

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

的問題是,你的$_變量設置爲文件名,但@_被設置爲參數。 CPAN documentation對於File::Find詳細解釋了這一點。

+0

天哪,我真的很困惑這裏.. – zedoo 2010-06-02 09:48:05

+0

沒有biggie。 Perl只是令人困惑。 – jasonmp85 2010-06-02 09:50:04

0

順便說一句,有更好的文件::查找在CPAN - (例如:文件::查找::規則或文件::查找::對象)的替代品。 File :: Find實際上是一種來自舊時代的化石,因爲它進入了核心。