我希望我的Perl脚本能够执行此操作
./code1 param1 param2 param3 | perl myperlscript.pl param1 param2
所以Perl脚本应该输入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
制作临时输出。
但由于输出很大,我更喜欢用管道输出。
请指出正确的方法。
答案 0 :(得分:4)
虽然@ARGV
不为空,但<>
运算符将从那里指定的文件中读取。 <{1}}一旦STDIN
用完就继续阅读。
如果在阅读@ARGV
和@ARGV
数组后明确清空@control_header
,程序应该按预期工作。或者,您可以使用@target_header
从STDIN
明确阅读。
但我相信最好使用Perl从文件参数中读取所需的信息。该计划展示了这个想法
<STDIN>
答案 1 :(得分:3)
在您的情况下,请从param1
移除param2
和@ARGV
。
my $param1 = shift;
my $param2 = shift;
现在,您可以使用
处理来自code1
的管道输出
while (<>) {
...;
}
更通用的解决方案是在
中使用bash process substitutionperl myperlscript.pl <(./other param1 param2) <(./code1 param1 param2 param3)
这使得other
和code1
的输出来自命名管道
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
}