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



我读过一些类似的帖子,但他们没有我想要的答案。基本上,我很难用这个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函数中通过引用传递,同时为文件名保留一个变量,以便我仍然可以检查"&eachFile"是否应用于正确的文件?

#!/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
        }
}

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

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, ...});

最新更新