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./)が表示される行です。これは 2 番目の問題につながります: 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
        }
}
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 に答える