#!/usr/bin/perl -w use strict; use IPC::Open2; my @command = ( 'perl', 'my test.pl', 'first arg1', '"second arg2"', 'word "quoted" and \"backslashed\" word', '"2word "quoted" and \"backslashed\" word"', ); my $pid = IPC::Open2::open2( \*r, \*w, @command ); print "Pid = $pid\n"; print "output:\n"; print while $_ = ; print "done\n"; #### Pid = 316925 output: 316925 [first arg1] 316925 [second arg2] 316925 [word] 316925 [quoted] 316925 [and] 316925 ["backslashed"] 316925 [word] 316925 [2word quoted and "backslashed" word] 316925 done done #### #!/usr/bin/perl -w use strict; my %self; my @command = ( 'perl', 'my test.pl', 'one arg', '"two arg"' ); { my $fh = windows_fork( \%self, @command ); print while <$fh>; } print "out of scope\n"; exit; sub windows_fork { my ( $self, @args ) = @_; require IPC::Open2; my ( $rdrfh, $wtrfh ); # Deal with windows quotes my @command = map { s/"/\\"/g; qq["$_"] } @args; my $pid = IPC::Open2::open2($rdrfh, $wtrfh, @command ); binmode $rdrfh, ':crlf'; tie *handle, 'call_waitpid', $rdrfh, $pid; return \*handle } package call_waitpid; use strict; sub TIEHANDLE { my ( $class, $fh, $pid ) = @_; bless { handle => $fh, pid => $pid, }, $class; } sub READLINE { my ( $self ) = @_; my $fh = $self->{handle}; return <$fh>; } sub DESTROY { my ( $self ) = @_; close $self->{handle}; waitpid $self->{pid}, 0; } #### syntax error at fork.pl line 81, near "<$self->{handle" #### my $fh = windows_fork( \%self, 'perl', 'my test.pl', 'first stuff'); my $fg = windows_fork( \%self, 'perl', 'my test.pl', 'other stuff'); print while <$fh>;