Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Re: feeding text to a process, and capturing its output, safely

by duelafn (Priest)
on Jun 09, 2011 at 16:10 UTC ( #908951=note: print w/ replies, xml ) Need Help??


in reply to feeding text to a process, and capturing its output, safely

Converted to a subroutine, make the exec safer, optionally capture STDERR, lexical filehandle:

=head3 safe_pipe safe_pipe [ options, ] command, input my $results = safe_pipe [ 'command', 'arg' ], @input; my @results = safe_pipe [ 'command', 'arg' ], @input; my $results = safe_pipe { capture_err => 1 }, [ 'command', 'arg' ], @ +input; Pipe data to a shell command safely (without touching a command line) +and retrieve the results. Options: =over 4 =item capture_err If true, STDERR will also be captured and included in returned results +. =back =cut sub safe_pipe { my $opt = {}; $opt = shift if 'HASH' eq ref($_[0]); my $command = shift; my ($RESULT, @x); $command = [$command] unless ref $command; if (open $RESULT, "-|") { # original process: receiver (reads $RESUL +T) @x = <$RESULT>; } else { if (open STDIN, "-|") { # child: processor (reads STDIN, writes ST +DOUT) open STDERR, ">&STDOUT" or die "Can't dup STDOUT: $!" if $$opt{c +apture_err}; exec { $$command[0] } @$command; die "Cannot exec @$command: $!"; } else { # grandchild: sender (writes STDOUT) print @_; exit 0; } } wantarray ? @x : join('', @x); }

Good Day,
    Dean


Comment on Re: feeding text to a process, and capturing its output, safely
Download Code

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://908951]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (17)
As of 2015-07-02 12:46 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (36 votes), past polls