http://qs321.pair.com?node_id=420741

mellin has asked for the wisdom of the Perl Monks concerning the following question:

I have a line of code that would need to call sub as well to return a value. So far the line only runs the sub but for some reason discards the return value. Perhaps a lot easier to explain with the actual code..

call the sub:
# give the sub two parameters, $saveOk gets then the subs return value my $saveOk = saveFile($frontPage, $xmlPrint); # printing the scalar below should now either give 1 or nothing # depending wether the file got saved or not print "$saveOk\n"; sub saveFile { open FH, ">$_[0]" or error($!, "not able to write to file $_[0]") and +return undef; flock FH, 2; # take exclusive-lock print FH "$_[1]"; # print to file-handle close FH; # if everything went fine, give 1 as an return value 1; }
That "and return undef" does not seem to work, it still tries to flock and print to it, even though it should get out of the sub and return undef value if the file could not be opened. How exactly should i get the sub to abort and return undef without using exit?

Replies are listed 'Best First'.
Re: calling sub and returning value from the same line
by jdalbec (Deacon) on Jan 09, 2005 at 20:43 UTC
    Is error() returning a false value? That would cause the behavior you describe. Remember that <EXPR> and <EXPR> executes the second expression only if the first expression is true. To avoid this dependence on the return value of error() you could try
    unless (open FH, ">$_[0]") { error($!, "not able to write to file $_[0]"); return undef; }
      Another alternative is to replace the "and" operator with a comma:
      open FH, ">$file" or error("msg"), return undef;
      If you do this, you must use parentheses to call the "error" function.

      --Dave
      Opinions my own; statements of fact may be in error.
•Re: calling sub and returning value from the same line
by merlyn (Sage) on Jan 09, 2005 at 20:36 UTC
Re: calling sub and returning value from the same line
by borisz (Canon) on Jan 09, 2005 at 20:37 UTC
    That work only if your  error function returns a true value.
    Boris
Re: calling sub and returning value from the same line
by Anonymous Monk on Jan 09, 2005 at 21:48 UTC

    How about this, instead?

    sub error { warn map { "$_\n" } @_; return undef; } # # and later # open FH, ">$_[0]" or return error($!, "not able to write to file $_[0]");
      return; is almost always preferable to return undef;.