# file: Subprocess.pm # Herve Saint-Amand # Universitaet des Saarlandes # Wed May 14 09:55:46 2008 # NOTE that to use this with Philipp Koehn's tokenizer.perl I had to modify # that script to autoflush its streams, by adding a '$|++' to it #------------------------------------------------------------------------------ # includes package Subprocess; use warnings; use strict; use Encode; use IPC::Open2; #------------------------------------------------------------------------------ # constructor 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;