sub get_reader {
my ($cmd) = @_;
open(my $pipe, '-|', @$cmd);
return sub {
return undef if !$pipe;
my $line = <$pipe>;
if (!defined($line)) {
close($pipe);
$pipe = undef;
return undef;
}
chomp($line);
return $line;
};
}
如果这还不够好(例如,还需要重定向孩子的stdin或stderr),可以使用ipc::run代替。
use IPC::Run qw( start );
sub get_reader {
my ($cmd) = @_;
my $buf = '';
my $h = start($cmd, '>', \$buf);
return sub {
return undef if !$h;
while (1) {
if ($buf =~ s/^([^\n]*)\n//) {
return $1;
}
if (!$h->pump())) {
$h->finish();
$h = undef;
return substr($buf, 0, length($buf), '') if length($buf);
return undef;
}
}
};
}
不管怎样,你现在可以
my $i = get_reader(['prog', 'arg', 'arg']);
while (defined( my $line = $i->() )) {
print "$line\n";
}
不管怎样,错误处理留给你。