结合来自STDIN的输入和Perl中的File

时间:2012-04-12 12:08:39

标签: perl file file-handling

我希望我的Perl脚本能够执行此操作

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

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

  1. 参数1
  2. param2的
  3. ./code1 param1 param2 param3
  4. 的输出

    我的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 个答案:

答案 0 :(得分:4)

虽然@ARGV不为空,但<>运算符将从那里指定的文件中读取。 <{1}}一旦STDIN用完就继续阅读。

如果在阅读@ARGV@ARGV数组后明确清空@control_header,程序应该按预期工作。或者,您可以使用@target_headerSTDIN明确阅读。

但我相信最好使用Perl从文件参数中读取所需的信息。该计划展示了这个想法

<STDIN>

答案 1 :(得分:3)

在您的情况下,请从param1移除param2@ARGV

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

现在,您可以使用

处理来自code1的管道输出
while (<>) {
  ...;
}

更通用的解决方案是在

中使用bash process substitution
perl myperlscript.pl <(./other param1 param2) <(./code1 param1 param2 param3)

这使得othercode1的输出来自命名管道

while (<>) {
  ...;
}

很乐意处理。

答案 2 :(得分: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>) {                                                                
  ...                                                                            
}                                                                                

答案 3 :(得分:-2)

您有两种选择。

1)阅读STDIN

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

}

2)从Perl脚本调用第一个程序并处理其输出。请参阅recipe 16.05 in Perl Cookbook

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

}