Previous | Table of Contents | Next |
Capturing OutputThe 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
|