0

我已经阅读了一些与此类似的帖子,但他们并没有我想要的答案。基本上,我正在努力使用这个 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./)在下面的代码中出现的行。这导致了第二个问题:如何在查找函数中通过引用传递,同时为文件名保留一个变量,以便我仍然可以检查“&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
        }
}
4

1 回答 1

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, ...});
于 2013-08-09T18:13:33.853 回答