在Perl脚本的中间,有一个我想要执行的系统命令。 我有一个字符串,其中包含需要输入stdin的数据(该命令只接受来自stdin的输入),我需要捕获写入stdout的输出。 我已经看过在Perl中执行系统命令的各种方法, open函数似乎是我需要的,除了它看起来我只能捕获stdin或stdout,而不是两者。

目前,似乎我最好的解决方案是将open ,redirect stdout用于临时文件,并在命令完成后从文件中读取。 有更好的解决方案吗?

===============>>#1 票数:6

IPC :: Open2 / 3很好,但我发现通常我真正需要的只是IPC :: Run3 ,它可以很好地处理简单的情况并且复杂度最低:

use IPC::Run3;    # Exports run3() by default

run3( \@cmd, \$in, \$out, \$err );

该文档将IPC :: Run3与其他替代方案进行了比较。 即使您不决定使用它,也值得一读。

===============>>#2 票数:3

IPC :: Open3可能会做你想要的。 它可以捕获STDERR和STDOUT。

http://metacpan.org/pod/IPC::Open3

===============>>#3 票数:3

位于脚本顶部的某处,包含该行

use IPC::Open2;

这将包括必要的模块,默认情况下通常安装大多数Perl发行版。 (如果没有它,可以使用CPAN安装它。)然后,而不是打开,调用:

$pid = open2($cmd_out, $cmd_in, 'some cmd and args');

您可以通过将数据发送到$ cmd_in将数据发送到命令,然后通过从$ cmd_out读取来读取命令的输出。

如果您还希望能够读取命令的stderr流,则可以使用IPC :: Open3模块。

===============>>#4 票数:3

perlipc文档涵盖了许多方法,包括IPC :: Open2和IPC :: Open3。

===============>>#5 票数:2

我最近发现的一个非常简单的方法是使用IPC :: Filter模块 它可以让您非常直观地完成工作:

$output = filter $input, 'somecmd', '--with', 'various=args', '--etc';

注意如果你传递一个列表,它如何在不通过shell的情况下调用你的命令。 它还可以合理地处理常见实用程序的错误。 (失败时,它会die ,使用STDERR中的文本作为错误消息;成功时,STDERR就会被丢弃。)

当然,它不适合大量数据,因为它无法进行任何流处理; 此外,错误处理可能不够精细,无法满足您的需求。 但它使许多简单的案例非常简单。

===============>>#6 票数:1 已采纳

我想你想看看IPC :: Open2

===============>>#7 票数:1

有一个特殊的perl命令

open2()

更多信息可以在以下网址找到: http//sunsite.ualberta.ca/Documentation/Misc/perl-5.6.1/lib/IPC/Open2.html

===============>>#8 票数:0

如果我只想要一行输出或想要将结果拆分为换行符以外的其他内容,我总是这样做:

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();  
    }  
}  

===============>>#9 票数:0

如果您不想包含额外的包,您可以这样做

open(TMP,">tmpfile");
print TMP  $tmpdata ;
open(RES,"$yourcommand|");
$res = "" ;
while(<RES>){
$res .= $_ ;
}

这与你的建议相反,但也应该有效。

  ask by translate from so

未解决问题?本站智能推荐:

2回复

用于从Perl中的系统命令输出的文件句柄

我在Perl中执行的系统命令的输出是否有文件句柄/句柄?
4回复

如何在Perl中向进程stdin / stdout / stderr读写大型缓冲区?

我想启动一个程序,向其stdin发送一些数据,读取其stdout / stderr并返回所有内容。 如果运行时间太长,我想杀死它。 我使用低级无缓冲io函数,以块为单位进行所有操作,使用select在写入/读取之前进行检查,但仍然失败。 使用以下脚本,在回写5000个字节后,bas
2回复

如何从OO Perl中的子进程读取STDOUT

在Perl中,读取子进程的STDOUT的一种方法是使用open : 我正在寻找一种更加面向对象的方法来做到这一点,而且我一直在使用IO::Pipe取得了一些成功。 我想检测错误,特别是如果命令不可执行。 不过,我无法弄清楚如何通过IO::Pipe来做到这一点。 这就是我所拥有的:
1回复

派生时Windows上Perl中STDOUT的IO句柄?

我有以下问题:我尝试将perl脚本移植到Windows。 该脚本经常分叉自身,并使用以下代码进行分叉: Windows不喜欢“-|” 它似乎。 我实际上不知道这是做什么的,作为Windows的家伙,但是这里有一些有趣的东西: http : //www.cs.tufts.edu/co
1回复

Perl 5.8从SSH命令获取标准输出

我需要创建一个可在CentOS 5.x和CentOS 6.x机器上使用的脚本。 CentOS 5.x使用Perl 5.8 ,CentOS 6.x使用Perl 5.10 。 目的是能够将ssh放入一个有密钥交换的盒子中,然后运行python -V以确定默认版本是否为python 2.6 。
9回复

如何在Perl脚本中运行Perl脚本?

我有一个需要执行另一个Perl脚本的Perl脚本。 第二个脚本可以直接在命令行上执行,但我需要在第一个程序中执行它。 我需要传递一些参数,这些参数通常在独立运行时传递(第一个脚本定期运行,并在一组系统条件下执行第二个脚本)。 Google的初步搜索建议使用反引号或system()调用。
1回复

从git捕获STDOUT / STDERR

我正在尝试通过IPC :: Run从perl执行git命令,该命令从perl变量中的git捕获STDOUT / STDERR-输出。 这是我所做的: 运行此结果将导致: $ stdout: 克隆到'abc'... $ stderr:空 从命令行运行git命
3回复

使用命名参数在perl脚本中运行perl脚本

我正在编写一个Perl程序,它必须在不同的输入上多次运行几个Perl脚本。 我试图使用的脚本是来自Text::NSP count.pl和statistic.pl 。 我自己没有写这些,所以我不想尝试将它们重构为一个模块。 我查看了一个类似的问题,并想出了如何使用IPC::Syste
1回复

我如何像这样的perl代码将null传递到stdin?

这是我的问题 ,显然 是答案 。 原来这是一个缓冲问题(不是我的ffmpeg链接的可接受答案中的解决方案),而不是stdin。 我发现可以通过在命令提示符下编写> NUL来将stdout设置为null,因此我尝试在参数末尾编写<NUL。 没运气。 如何传
6回复

Perl中的系统,exec和反引号有什么区别?

在Perl中,要从我的脚本运行另一个Perl脚本,或运行任何系统命令,如mv , cp , pkgadd , pkgrm , pkginfo , rpm等,我们可以使用以下命令: system() exec() `` (反叛) 三者都是一样的,还是不一样? 在