Capturing Output

 <  Day Day Up  >  

The system function does have a small shortcoming: It doesn't offer any particularly good way to capture the command's output and bring it into Perl for analysis. To do so in a roundabout way, you could use this workaround:

 # 'ls' and 'dir' used for example only. opendir/readdir # would be more efficient in most cases. system("dir > outfile");    # Use "ls" instead of "dir" for Unix open(OF, "outfile")  die "Cannot open output: $!"; @data=<OF>; close(OF); 

In the preceding snippet, the command run by system has its output redirected to a file called outfile. The file is then opened and read into an array. The array @data now contains the output of the dir command.

This method is messy and not too clever. Not surprisingly, Perl has another way of dealing with this situation: backticks , also called backquotes . Any command that is surrounded by backticks ( `` ) is run by Perl as an external command ”as though through system ”and the output is captured and returned as the return value from the backticks. Consider this example using backticks:

 $directory=`dir`;    # Unix users, use ls instead of dir 

In the preceding snippet, the dir command is run, and the output is captured in $directory .

Inside the backticks, all normal shell processing is observed : > does redirection, does piping, and under Unix, & starts tasks in the background. Keep in mind, though, that commands that have been run in the background or that have had their output redirected with > have no output to capture.

In a scalar context, backticks return the output of the command as a single string. If the command output contains many lines of text, those lines all appear in the string, separated by record separator characters ( "\n" ). In a list context, the output is assigned to the list, with record separators at the end of each line.

Now consider this example:

 @dir=`dir`;  # Use 'ls' for Unix users foreach(@dir) {     # Process each line individually. } 

In the preceding snippet, the output in @dir is processed in the foreach loop, one line at a time.

Perl has another way of representing backticks ”that is, to use the notation qx{} . The command you want to execute goes between the braces ( {}), as in this example:

 $perldoc=qx{perldoc perl}; 

By using the qx operator, you can avoid the trouble of having to put backslashes in front of backticks when they appear as part of the command, as shown here:

 $complex=`sort \'grep -l 'conf' *\``;  # Somewhat messy 

You can rewrite the preceding snippet as fo

 <  Day Day Up  >  


SAMS Teach Yourself Perl in 24 Hours
Sams Teach Yourself Perl in 24 Hours (3rd Edition)
ISBN: 0672327937
EAN: 2147483647
Year: 2005
Pages: 241

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net