2012-09-27 25 views
2

我覺得File::Find::find背後的設計選擇有點令人驚訝。我遇到的所有例子都顯示在void context中使用findFile :: Find是否有更清晰的方式來返回想要的文件列表?

documentation還明確,在find(\&wanted, @dirs)\&wanted CODEREF並不意味着是一個過濾器(強調我自己):

wanted()函數做任何你想要的驗證上每個 文件目錄。需要注意的是,儘管它的名字,在wanted() 功能是一個通用的回調函數,確實告訴 File::Find如果一個文件被「通緝令」與否。事實上,其返回值 被忽略。


不過如果我想用它爲以類似grep過濾器是什麼?我很好奇,想知道是否有另一種方式來寫:

use strict; 
use warnings; 
use feature 'say'; 

use File::Find; 

my $wanted = qr/^\d{2}_/; # e.g. 

my @wanted; 
find(sub { -f && /$wanted/ && push @wanted, $_ }, '.'); 

# I wish my @wanted = find(...); worked 

say for @wanted; 
+0

之前有人建議使用'glob'或'readdir',之所以我想用'文件::查找:: find'是因爲它的遞歸到目錄的能力。 – Zaid

+0

我認爲你現在的代碼非常好。你爲什麼需要替代品?我可能會改說你想要的coderef,但沒有什麼不同。 – pmakholm

+0

@pmakholm:我知道代碼沒有問題......但似乎麻煩要累積裏面'\&wanted'結果,我想知道是否有,讓我產生了一個功能或替代語法過濾了我的列表。 – Zaid

回答

7

尋找CPAN上,我發現幾個替代的接口文件::查找可用的目標是簡化的接口。

我會嘗試File::Finder,由著名的Perl專家蘭德爾·施瓦茨,第一。

File::Find::Rule是另一個。

(這可能是安全的說,如果人們書寫模塊要做到這一點,有沒有簡單的內置的方式做到這一點。)

+3

嗯...我不認爲我必須超越'文件::查找'這種功能。雖然我喜歡你的推薦選擇,特別是'File :: Find :: Rule' – Zaid

+5

'File :: Finder'具有'File :: Find :: Rule'的所有功能(你甚至可以使用FFR插件!)和更多。我寫了'File :: Finder',因爲我記不起FFR的命名約定......我的精確地遵循'find(1)'。 –

2

我覺得你在使用它正確的方法。您可以做的唯一事情是將find函數包裝在另一個創建陣列的函數中(使用push),然後將其返回。

sub find_to_array { 
    my $wanted = shift; 
    my @array; 
    find(sub { -f && /$wanted/ && push @array, $_ }, '.'); 
    return @array; 
} 

以這種方式,你可以找到你正在尋找的東西,但它幾乎與你所做的一樣。

+0

+1,但是我沒有在解決問題之後:) – Zaid

相關問題