如何从Perl打开管道捕获STDOUT?

时间:2012-08-22 22:30:26

标签: perl wget

如何通过以下方式从Perl调用wget捕获STDOUT返回并将其放入变量?

my @urls = ('url1', 'url2', 'url3');

open(GET, "| xargs -n1 -P 3 wget -qO- ") || die "get failed: $!\n";
print GET "@urls";

2 个答案:

答案 0 :(得分:2)

如果您想一次性覆盖所有数据,IPC::Run可以做到这一点。

use IPC::Run qw(run);
run [qw(xargs -n1 -P 3 wget -qO-)], \"@urls", \my $out;
print "$out";

如果要在数据可用时处理数据,IPC::Run也可以这样做。

use IPC::Run qw(run);
run [qw(xargs -n1 -P 3 wget -qO-)], \"@urls", sub {
    print $_[0];
};

答案 1 :(得分:0)

首先,your pipe is an input pipe, and open doesn't support both input and output pipes。作为替代方案,使用管道输出并为每个URL打开一个文件句柄:

use strict;
use warnings;

my @urls=qw(url1 url2 url3);

foreach my $url(@urls)
{
  open(my $get,"-|","wget $url") or die $!;

  print while(<$get>);

  close($get);
}