I was using Perl to read through each line of a file. I used a command line tool to call a service, and I noticed some interesting functionality that I can’t figure out how to search for. To the variable $cmd I assigned the command that invokes the service. If I refer to $cmd later in the code it prints out the command line argument, but if I refer to it as `$cmd`, however, it gives the output from running the service.
What is the explanation for this?
It works just like backquotes in the shell, which is why it is called that. See sh(1) for details. It captures the standard output alone, and nothing else. It sets the
$?variable to the 16-bit wait status word.This is all explained in the perlop(1) manpage:
Here’s a simple example of using backticks to get the exit status of the first element in a pipeline:
EDIT
Well ok then, so maybe that wasn’t that simple an example. 🙂 But this one is.
I’d like to recommend the Capture::Tiny CPAN module as a simpler way to manage the output from external commands that you would normally run using backquotes. It has advantages and disadvantages, but I feel that for many people, the advantages outweigh any arguable disadvantageL
The advantage is that you get to do all this without requiring deep knowledge of arcane mysteries of file-descriptor redirection the way the previous example did.
The disadvantage is it’s yet another non-core dependency — something else you have to install from CPAN.
That’s really not bad for what you get.
Here’s an example of how easy it is:
There, isn’t that a whole lot easier?