0

Perl スクリプトでこれを実行できるようにしたい

./code1 param1 param2 param3 | perl myperlscript.pl param1 param2

したがって、Perl スクリプトは 3 つの入力を受け取る必要があります。

  1. パラメータ1
  2. param2
  3. の出力 ./code1 param1 param2 param3

Perlコードにこれがありますが、うまくいきません:

my $param1 = $ARGV[0] || "control.fst";
my $param2  = $ARGV[1] || "target.fst";

my @control_header = `grep ">" $param1`;
my @target_header = `grep ">" $param2`;
# Later to do something with those arrays

while (<>) {
 # do something again
}

の一時出力を作成できることは承知しています./code1。しかし、出力が非常に大きいので、私はそれをパイプすることを好みます。どうするのが正解なのかアドバイスお願いします。

4

4 に答える 4

4

@ARGV空でない間、<>オペレーターはそこで指定されたファイルから読み取ります。読み尽くされSTDINたら読み続けます。@ARGV

および配列@ARGVを読み取った後に明示的に空にすると、プログラムは期待どおりに動作するはずです。または、を使用して明示的に読み取ることもできます。@control_header@target_headerSTDIN<STDIN>

しかし、必要な情報をファイル パラメータから読み取るには、Perl を使用する方がよいと思います。このプログラムは、アイデアを示しています

use strict;
use warnings;

my $param1 = shift || 'control.fst';
my @control_header = do {
  open my $fh, '<', $param1 or die qq(Unable to open file "$param1": $!);
  grep />/, <$fh>;
};

my $param2 = shift || 'target.fst';
my @target_header = do {
  open my $fh, '<', $param2 or die qq(Unable to open file "$param2": $!);
  grep />/, <$fh>;
};

while (<STDIN>) {
  # do something again
}
于 2012-04-12T12:54:49.423 に答える
3

param1あなたの場合、とparam2から削除し@ARGVます。

my $param1 = shift;
my $param2 = shift;

code1これで、パイプされた出力を使用して処理できます

while (<>) {
  ...;
}

より一般的な解決策は、次のようにbash プロセス置換を使用することです。

perl myperlscript.pl <(./other param1 param2) <(./code1 param1 param2 param3)

これにより、名前付きパイプの出力othercode1出現が行われます。

while (<>) {
  ...;
}

喜んで処理します。

于 2012-04-12T14:14:27.327 に答える
0

より多くの perlishコードは次のようになります。

#!/usr/bin/perl

use strict;
use warnings;

my $param1 = $ARGV[0] || "control.fst";
my $param2 = $ARGV[1] || "target.fst";

my @control_header;
my @target_header;

open FH, "<$param1" or die;
map { push @control_header, $1 if /^(.*?>.*?)[\n\r]*$/ } (<FH>);
close FH;

open FH, "<$param2" or die;
map { push @target_header,  $1 if /^(.*?>.*?)[\n\r]*$/ } (<FH>);
close FH;

...                                                                              

while (<STDIN>) {                                                                
  ...                                                                            
}                                                                                
于 2012-04-12T13:16:31.207 に答える
-2

2 つのオプションがあります。

1) STDIN を読む

while (<STDIN>) {
chomp();  
# do something again

}

2) Perl スクリプトから最初のプログラムを呼び出し、その出力を処理します。Perl Cookbook のレシピ 16.05 を参照してください。

open(PRG,"./code1 param1 param2 param3|") or die $!;
while (<PRG>) {
chomp();  
# do something again

}
于 2012-04-12T12:21:13.553 に答える