我读过一些类似的帖子,但他们没有我想要的答案。基本上,我很难用这个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, ...});