2010-01-13 41 views
13

使用File::Find,我如何將參數傳遞給處理每個文件的函數?如何將參數傳遞給處理每個文件的File :: Find子例程?

我有一個Perl腳本遍歷目錄,以便將一些3通道TIFF文件轉換爲JPEG文件(每個TIFF文件有3個JPEG文件)。這有效,但我想傳遞一些參數給處理每個文件的函數(使用全局變量)。

這裏就是我試圖傳遞參數的腳本中的相關部分:

use File::Find; 

sub findFiles 
{ 
    my $IsDryRun2 = ${$_[0]}{anInIsDryRun2}; 
} 

find ({ wanted => \&findFiles, anInIsDryRun2 => $isDryRun }, $startDir); 

$isDryRun是標量。 $startDir是一個字符串,一個目錄的完整路徑。

$IsDryRun2未設置:(。)在串聯或串

使用未初始化值$ IsDryRun2的 TIFFconvert.pl線197 (W未初始化)一個未定義的值作爲(#1)如果已經定義了 。它被解釋爲「」或0,但也許這是一個錯誤。 要抑制此警告,請將一個定義的值分配給您的變量。

(舊的呼叫不帶參數爲:find (\&findFiles, $startDir);


測試平臺(但生產的家庭將是一臺Linux機器,Ubuntu的9.1,Perl的5.10,64位)的ActiveState Perl的64位。 Windows XP。來自perl -v:v5.10.0爲MSWin32-x64-multi-thread構建的二進制版本1004 [287188]由ActiveState提供

回答

15

你需要創建一個子參照與所需的參數調用你想要的子:

find( 
    sub { 
    findFiles({ anInIsDryRun2 => $isDryRun }); 
    }, 
    $startDir 
); 

這是,更多或更少,鑽營。這只是不是漂亮的柯里。 :)

+0

謝謝,它的工作。是否需要第一個分號(第三行)? – 2010-01-13 13:05:39

+0

你不需要那個分號,但它不會傷害到它。 – 2010-01-13 14:06:59

+0

@hobbs =>我一直很喜歡Perl處理與匿名字符串的方式。你會喜歡什麼? – 2010-01-16 02:42:55

3

你可以創建任何你喜歡的代碼引用。您不必使用對指定子例程的引用。有關如何執行此操作的許多示例,請參閱我的File::Find::Closures模塊。我創建了這個模塊來回答這個問題。

0
# 
# ----------------------------------------------------------------------------- 
# Read directory recursively and return only the files matching the regex 
# for the file extension. Example: Get all the .pl or .pm files: 
#  my $arrRefTxtFiles = $objFH->doReadDirGetFilesByExtension ($dir, 'pl|pm') 
# ----------------------------------------------------------------------------- 
sub doReadDirGetFilesByExtension { 
    my $self = shift; # Remove this if you are not calling OO style 
    my $dir = shift; 
    my $ext = shift; 

    my @arr_files =(); 
    # File::find accepts ONLY single function call, without params, hence: 
    find(wrapp_wanted_call(\&filter_file_with_ext, $ext, \@arr_files), $dir); 
    return \@arr_files; 
} 

# 
# ----------------------------------------------------------------------------- 
# Return only the file with the passed extensions 
# ----------------------------------------------------------------------------- 
sub filter_file_with_ext { 
    my $ext  = shift; 
    my $arr_ref_files = shift; 

    my $F = $File::Find::name; 

    # Fill into the array behind the array reference any file matching 
    # the ext regex. 
    push @$arr_ref_files, $F if (-f $F and $F =~ /^.*\.$ext$/); 
} 

# 
# ----------------------------------------------------------------------------- 
# The wrapper around the wanted function 
# ----------------------------------------------------------------------------- 
sub wrapp_wanted_call { 
    my ($function, $param1, $param2) = @_; 

    sub { 
     $function->($param1, $param2); 
    } 
} 
+0

您可能想要添加示例代碼的解釋。也可能是3個函數的示例使用。 – 2018-03-04 14:21:08

+0

恕我直言func註釋已滿足+ doReadDirGetFilesByExtension函數顯示的用法。我真的認爲,如果用戶沒有得到這些評論和描述的功能,可能他/她不應該使用這些代碼,因爲他/她可能會失去更多的時間來調整他/她的需求,而不是找出解決方案以另一種方式爲他/她的問題 - TMTOWTDI ... – 2018-03-04 14:35:52

相關問題