|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package Subprocess;
|
|
|
|
|
|
use warnings;
|
|
|
use strict;
|
|
|
|
|
|
use Encode;
|
|
|
use IPC::Open2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sub new {
|
|
|
my ($class, @cmd) = @_;
|
|
|
bless {
|
|
|
cmd => \@cmd,
|
|
|
num_done => 0,
|
|
|
child_in => undef,
|
|
|
child_out => undef,
|
|
|
}, $class;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
sub start {
|
|
|
my ($self) = @_;
|
|
|
open2 ($self->{child_out}, $self->{child_in}, @{$self->{cmd}});
|
|
|
}
|
|
|
|
|
|
sub do_line {
|
|
|
my ($self, $line) = @_;
|
|
|
my ($in, $out) = ($self->{child_in}, $self->{child_out});
|
|
|
|
|
|
$line =~ s/\s+/ /g;
|
|
|
print $in encode ('UTF-8', $line), "\n";
|
|
|
$in->flush ();
|
|
|
|
|
|
my $ret = decode ('UTF-8', scalar <$out>);
|
|
|
chomp $ret;
|
|
|
|
|
|
$self->{num_done}++;
|
|
|
return $ret;
|
|
|
}
|
|
|
|
|
|
sub num_done { shift->{num_done} }
|
|
|
|
|
|
|
|
|
|
|
|
1;
|
|
|
|
|
|
|