在perl中的File Find函数中通过引用传递

时间:2013-08-09 18:10:51

标签: perl

我已经阅读了一些与此类似的帖子,但他们并没有得到我想要的答案。基本上,我正在努力通过引用传递这个File :: find函数。原始代码很大。所以我拿出了一些代码。

请注意

$node,$ref_p, $ref_alphaSUM ,$ref_rank, $ref_sorted_alpha, $output_file

是全局变量的所有变量或引用。我需要以递归方式遍历目录并将& eachFile子例程应用于每个文件,这将更新上述变量。 “& whichFiles”子例程只对文件名进行排序。

第一个问题:由于并非目录中的所有文件都包含字符串 nfcapd ,我添加了行 if(/ ^ nfcapd./)检查文件名是否包含此字符串。但由于我也将上述变量传递给eachFile,因此现在无法使用“$ _”。

因此,我相信这就是我不断收到以下错误的原因:(如果我错了请纠正我):

Use of uninitialized value $File::Find::name in pattern match (m//) at
    ./pvalues.pl line 178, <PRE> line 65184 (#1)

第178行是 if(/ ^ nfcapd ./)出现在下面的代码中的行。 这导致第二个问题:如何在find函数中通过引用传递,同时保留文件名的变量,这样我仍然可以检查“&amp; eachFile”是否正在应用于正确的文件? / p>

#!/usr/bin/perl
use strict;
use warnings;
use File::Find;

find ({wanted => \&eachFile($node,$ref_p, $ref_alphaSUM ,$ref_rank, $ref_sorted_alpha, $output_file), preprocess => \&whichFiles},$flow_data_path);


sub eachFile    {
    my ($node , $ref_p, $ref_alphaSUM ,$ref_rank, $ref_sorted_alpha , $output_file) = @_;
       if(/^nfcapd\./){
             #do something
        }
}

1 个答案:

答案 0 :(得分:2)

要将变量传递给您想要的子,您需要一个闭包:

sub eachFile {
    my ($node , $ref_p, $ref_alphaSUM ,$ref_rank, $ref_sorted_alpha , $output_file) = @_;

    if(/^nfcapd\./){
        #do something
    }
}

my $wanted = sub { eachFile($node,$ref_p, $ref_alphaSUM ,$ref_rank, $ref_sorted_alpha, $output_file) };

find({wanted => $wanted, ...});
相关问题