1

複数のファイルを単一のファイルハンドルに割り当てようとしています。そこからファイルハンドル全体を処理して特定のパターンを探し、それを FIN_RESULTS に書き込みます。

Linux
exp ファイル
my/dir1/RESULTS
my/dir2/RESULTS
など。

これが私の厄介な試行錯誤でした

   open (FIN_RESULTS, ">", "FIN_RESULTS.txt") or die $!;

   open(RESULTS, "-|"," find my/ -name RESULTS -print0 | xargs -0 cat");
   while(<RESULTS>){
        if(/match_something/){
           do some commands;
           print FIN_RESULTS $_;
         }
close FIN_RESULTS;
close RESULTS;

しかし、現在のディレクトリの ls で perl スクリプト自体を上書きしてしまいます。

助けてくれてありがとう!!!!!当初考えていたことを実行することができました。

特定のディレクトリのみを検索するように検索を実装することは可能ですか?
my/abc_dir1/RESULTS
my/dsa_dir2/RESULTS
my/afx_dir3/RESULTSがある場合など

しかし、dir2 と dir3 だけを検索したいのです。

@array1 = qw( dir2 dir3);

foreach $array1(@array1)
{ open(RESULTS, "-|"," find my/*$array1 -name RESULTS -print0 | xargs -0 cat");
}

しかし、xargs: cat:terminated by signal 13 というエラーが表示されます。そのため、ファイルハンドルを複数回開くことはできません。私に何ができるかについて何か提案はありますか?

4

2 に答える 2

3

あなたが本当に外部検索を行いたいと仮定すると:

open RESULTS, "-|", "find my -name RESULTS -print0 | xargs -0 cat"

やりたいことをやればいい。

于 2012-08-15T00:03:37.933 に答える
3

openPerl の関数には 2 つの形式があります。

2 つの引数呼び出し:

open (RESULTS, "|find my/ -name 'RESULTS'")

2 つの引数の呼び出しは単純ですが、たまたま垂直パイプで始まるファイル名があると、問題が発生します。

もう 1 つは、推奨される THREE ARGUMENT 構文です。

open (RESULTS, "-|", "find my/ -name 'RESULTS'")

この構文は、2 番目の引数を使用して、実行しているオープンのタイプを示します。

">" -  Write
">>" - Append
"<"  - Read
"-|" - Read from command
"|-" - Write to command

2つを混同してしまったようです。


ただのメモ:

File::Findモジュールを使用して、Perl の代わりに検索を行うことができます。

別のプロセスを起動しないため、より効率的であり、Windows または Linux で同じように動作するため、オペレーティング システムに依存しません。

于 2012-08-15T18:08:04.497 に答える