![](/img/trans.png)
[英]How can I get a Perl script to accept parameters from both STDIN and command line arguments?
[英]How can I capture the stdin and stdout of system command from a Perl script?
在Perl脚本的中间,有一个我想要执行的系统命令。 我有一个字符串,其中包含需要输入stdin的数据(该命令只接受来自stdin的输入),我需要捕获写入stdout的输出。 我已经看过在Perl中执行系统命令的各种方法, open
函数似乎是我需要的,除了它看起来我只能捕获stdin或stdout,而不是两者。
目前,似乎我最好的解决方案是将open
,redirect stdout用于临时文件,并在命令完成后从文件中读取。 有更好的解决方案吗?
IPC :: Open2 / 3很好,但我发现通常我真正需要的只是IPC :: Run3 ,它可以很好地处理简单的情况并且复杂度最低:
use IPC::Run3; # Exports run3() by default
run3( \@cmd, \$in, \$out, \$err );
该文档将IPC :: Run3与其他替代方案进行了比较。 即使您不决定使用它,也值得一读。
IPC :: Open3可能会做你想要的。 它可以捕获STDERR和STDOUT。
位于脚本顶部的某处,包含该行
use IPC::Open2;
这将包括必要的模块,默认情况下通常安装大多数Perl发行版。 (如果没有它,可以使用CPAN安装它。)然后,而不是打开,调用:
$pid = open2($cmd_out, $cmd_in, 'some cmd and args');
您可以通过将数据发送到$ cmd_in将数据发送到命令,然后通过从$ cmd_out读取来读取命令的输出。
如果您还希望能够读取命令的stderr流,则可以使用IPC :: Open3模块。
perlipc文档涵盖了许多方法,包括IPC :: Open2和IPC :: Open3。
我最近发现的一个非常简单的方法是使用IPC :: Filter模块 。 它可以让您非常直观地完成工作:
$output = filter $input, 'somecmd', '--with', 'various=args', '--etc';
注意如果你传递一个列表,它如何在不通过shell的情况下调用你的命令。 它还可以合理地处理常见实用程序的错误。 (失败时,它会die
,使用STDERR中的文本作为错误消息;成功时,STDERR就会被丢弃。)
当然,它不适合大量数据,因为它无法进行任何流处理; 此外,错误处理可能不够精细,无法满足您的需求。 但它使许多简单的案例非常简单。
我想你想看看IPC :: Open2
有一个特殊的perl命令
open2()
更多信息可以在以下网址找到: http : //sunsite.ualberta.ca/Documentation/Misc/perl-5.6.1/lib/IPC/Open2.html
如果我只想要一行输出或想要将结果拆分为换行符以外的其他内容,我总是这样做:
my $result = qx( command args 2>&1 );
my $rc=$?;
# $rc >> 8 is the exit code of the called program.
if ($rc != 0 ) {
error();
}
如果要处理多行响应,请将结果作为数组获取:
my @lines = qx( command args 2>&1 );
foreach ( my $line ) (@lines) {
if ( $line =~ /some pattern/ ) {
do_something();
}
}
如果您不想包含额外的包,您可以这样做
open(TMP,">tmpfile");
print TMP $tmpdata ;
open(RES,"$yourcommand|");
$res = "" ;
while(<RES>){
$res .= $_ ;
}
这与你的建议相反,但也应该有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.