in reply to Re: Capture external program return value
in thread Capture external program return value

Backticks are documented to return undef on error
And to further clearify, that's errors regarding the execution of the given program. The OP also mentions getting the return value - a non-zero exit code means (by convention) that the executed program encountered an error. In that case, backticks will not return undef. However, even backticks set $?, so the return value can be found as $? >> 8.

Replies are listed 'Best First'.
Re^3: Capture external program return value
by ikegami (Patriarch) on May 02, 2010 at 16:44 UTC
    my $result = `blastall -i foo -o bar -p blastx -d baz`; die("Could not execute blastall: $!\n") if !defined($result); die("Died from signal ", ($? & 127), "\n") if $? & 127; die("Exited with error ", ($? >> 8), "\n") if $? >> 8;
      I think that could be simplified to
      use IPC::System::Simple qw( capture ); my $result = capture('blastall -i foo -o bar -p blastx -d baz');
        Indeed. And since IPC::System::Simple gives access to the list form for exec, might as well use it to save us from creating shell literals from the args.
        use IPC::System::Simple qw( capture ); my $result = capture( blastall => ( -p => 'blastx', -d => $baz, -i => $foo, -o => $bar, ) );

        But looking at what those args are, it seems to me that it makes no sense to use backticks, capture or capturex with -o. system (or IPC::System::Simple's version) would be more appropriate.