16.1. Gathering Output from a ProgramProblemYou want to run a program and collect its output into a variable. Solution$output = `program args`; # collect output into one multiline string @output = `program args`; # collect output into array, one line per element Or use Recipe 16.4 : open(README, "program args |") or die "Can't run program: $!\n"; while(<README>) { $output .= $_; } close(README); DiscussionThe backticks are a convenient way to run other programs and gather their output. The backticks do not return until the called program exits. Perl goes to some trouble behind the scenes to collect the output, so it is inefficient to use the backticks and ignore their return value: `fsck -y /dev/rsd1a`; # BAD AND SCARY
Both the
A high-level workaround is given in
Recipe 19.6
. Here's a low-level workaround, using use POSIX qw(:sys_wait_h); pipe(README, WRITEME); if ($pid = fork) { # parent $SIG{CHLD} = sub { 1 while ( waitpid(-1, WNOHANG)) > 0 }; close(WRITEME); } else { die "cannot fork: $!" unless defined $pid; # child open(STDOUT, ">&=WRITEME") or die "Couldn't redirect STDOUT: $!"; close(README); exec($program, $arg1, $arg2) or die "Couldn't run $program : $!\n"; } while (<README>) { $string .= $_; # or push(@strings, $_); } close(README); See AlsoThe section on "Cooperating with Strangers" in Chapter 6 of Programming Perl , or perlsec (1); Recipe 16.2 ; Recipe 16.4 ; Recipe 16.10 ; Recipe 16.19 ; Recipe 19.6 |
|