0

我想让我的 Perl 脚本能够做到这一点

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

所以 Perl 脚本应该接受 3 个输入:

  1. 参数1
  2. 参数2
  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_header数组后显式清空,则程序应该按预期工作。或者,您可以STDIN使用<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

在您的情况下param1param2@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

您有两种选择。

1) 读取标准输入

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 回答