in reply to Re: Net::SSH2 test connection to remote host
in thread Net::SSH2 test connection to remote host

Corion what's with the 1 as the last statement in the eval? I don't think I've come across that idiom.

-derby

Replies are listed 'Best First'.
Re^3: Net::SSH2 test connection to remote host
by Corion (Patriarch) on Sep 30, 2008 at 11:52 UTC

    The ; 1 is to make sure I get a true value no matter what the function returns. If it fails, I think there are cases where the block still might return a true value, but I don't know.

      But as it, it's an example of cargo-cult. Sure, $res is true if and only if the eval doesn't fail, but you're not using its result. Instead, you rely on $@ to determine failure. But the entire '; 1' idiom is there because relying on $@ to determine failure can trigger both false positives and false negatives. The correct idiom is:
      my $res = eval {...statements...; 1}; unless ($res) { ... eval failed ... }
        relying on $@ to determine failure can trigger both false positives and false negatives

        Can you explain how?

        The usual way to handle errors from functions that die to signal them is:

        eval { do_whatever() }; if ($@) { # handle error ... }
        or if you want to use the value returned by do_whatever():
        my $res = eval { do_whatever() }; if ($@) { # handle error ... } # use $res here;
        I believe that the 1 usage comes from...
        eval { do_whatever(); 1 } or print "failed!\n";