http://qs321.pair.com?node_id=496340


in reply to Running a string through a filter program and recieving the output as a string

You can always use open2 if you want a bidirectional pipe. This program pipes the command to tr(1) to get back a modified command:
use IPC::Open2; open2 ( REA, WRI, 'tr a-z A-Z' ) or die $!; for (<DATA>){ print {\*WRI} [(my $cmd, my @rest) = split]->[0]; } close WRI; print <REA>; __END__ an apple a day boat for bloat
  • Comment on Re: Running a string through a filter program and recieving the output as a string
  • Download Code

Replies are listed 'Best First'.
Re^2: Running a string through a filter program and recieving the output as a string
by Moron (Curate) on Oct 20, 2005 at 14:57 UTC
    Although when using SystemV (Sunos 5.9) today, I had a complaint about a defunct process being left even after closing both the read and write channels - this being in a subroutine that handled repeated communications with a time-series database language interpreter. At some point there was one defunct process for each time I had called the subroutine. To fix this, I had to modify the code to specifically tell the parent to wait. It seems silly that I should have to do that, but on the other hand it is indeed partially documented in perlipc. Here is what I had to do to fix it, but applied to the above piece of code instead of mine:
    use IPC::Open2; use POSIX ":sys_wait_h"; my $pid = open2 ( REA, WRI, 'tr a-z A-Z' ) or die $!; for (<DATA>){ print {\*WRI} [(my $cmd, my @rest) = split]->[0]; } close WRI; print <REA>; close REA; # but believe it or not, under sysV the zombie is still the +re! waitpid($pid,0); # this will finally kill it cleanly! __END__ # although exit from the program will eventually kill it of co +urse an apple a day boat for bloat

    -M

    Free your mind