2

我将如何捕获从 wget 以下列方式被 Perl 调用的 STDOUT 返回并将其放入变量中?

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

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

2 回答 2

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];
};
于 2012-08-23T00:55:56.807 回答
0

首先,您的管道是输入管道,open不支持输入和输出管道。作为替代方案,使用管道输出并为每个 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);
}
于 2012-08-22T22:38:47.983 回答