Yet another way to launch a process is to create a process that looks
like a
filehandle
(similar to the
popen
C library
routine, if you’re familiar with that). We can create a process
filehandle that either captures the output from or provides input to
the process.[87] Here’s an example of creating
a filehandle out of a
netstat
process. Because the process is generating output that we want to
read, we make a filehandle that is open for reading, like so:
open(NETPROC, "netstat|"); # open netstat for reading
Note the
vertical
bar on the right side of netstat
. That bar tells
Perl that this open
is not about a filename, but
rather, is about a command to be started. Because the bar is on the
right of the command, the filehandle is opened for reading, and the
standard output of netstat is going to be
captured. (The standard input and standard error remain shared with
the Perl process.) To the rest of the program, the
NETPROC
handle is merely a filehandle that is open
for reading, and all normal file I/O operators apply. Here’s a
way to read data from the
netstat command into an array:
@netstat = <NETPROC>;
Similarly, to open a command that expects input, we can open a process filehandle for writing by putting the vertical bar on the left of the command, like so:
open(FIND,"|find $pattern"); print FIND @filedata; close(FIND);
In this case, after opening FIND
, we wrote some
data to it and then closed it. Opening a process with a process
filehandle allows the command to execute in parallel with the Perl
program. Saying
close
on the filehandle forces the Perl program to wait until the process
exits. If you don’t close the filehandle, the process can
continue to run even beyond the execution of the Perl program.
You don’t have to open just one command at a time. You can open an entire pipeline. For example, the following line starts up a dir process, which pipes its output into a sort process, which finally sends its output along to the DIRPR filehandle:
open(DIRPR, "dir | sort |");
The
exit
function causes
an immediate exit from the current Perl process. You’d use this
to abort a Perl program from somewhere in the middle. The
exit
function takes an optional parameter, which
serves as the numeric
exit value that can be noticed by the
parent process. The default is to exit with a zero value, indicating
that everything went OK.
[87] But not both at once. See Chapter 6 of Programming Perl for examples of bidirectional communication.