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

Monks,

I'm stumped on a code example from the Camel book (Section 2.5.1, 2nd Ed.):

print($foo, exit); # Obviously not what you want.
The 'exit' function is being called from within a print function's list of arguments. How/Why does a function such as 'exit' even execute in this context? Why is it executing before $foo gets printed? Obviously, I don't understand the Camel's explanation.

As always, any insight is much appreciated.

$PM = "Perl Monk's";
$MCF = "Most Clueless Friar Abbot";
$nysus = $PM . $MCF;

Replies are listed 'Best First'.
Re: Question of example from Camel Book
by myocom (Deacon) on Jun 20, 2001 at 09:34 UTC

    In order to print something, it needs to evaluate the values of what it's trying to print. For example, print ($foo, length($foo)); evaluates what $foo's value is and what length($foo)'s value is, then prints them.

    In the Camel's example, exit gets called, with the intention of determining its value, but when you call exit, you do just that: exit.

Re: Question of example from Camel Book
by clemburg (Curate) on Jun 20, 2001 at 13:16 UTC

    print($foo, exit); # Obviously not what you want.

    The print function is called with two arguments, $foo, and exit. Both will be evaluated to get at their values, and these values will then be sent to the print function to print out. That is, $foo evaluates to whatever is stored in it (say, the string "hi"), and then exit is evaluated by calling the exit function, which aborts the program. So print never gets a chance to print anything.

    This is rather basic. More interesting is why this prints something:

    print ($foo), exit;
    Here the expression consists of a call to the print function with one argument, and then a comma, and then a call to the exit function. As a comma operator evaluates its left argument, throws the return value away, and the evaluates its right argument, first the call to print($foo) is evaluated, resulting in a call to print, this in turn will evaluate $foo and send its value to the print function (making it print out something like "hi"), and then second, the call to exit is evaluated, aborting the program.

    You should read Structure and Interpretation of Computer Programs.

    Christian Lemburg
    Brainbench MVP for Perl
    http://www.brainbench.com

Re: Question of example from Camel Book
by lemming (Priest) on Jun 20, 2001 at 09:38 UTC

    print needs to evaluate the function to see what is returned to be printed
    Not this fragment is useful, but you can see why one would want the function to return a value first.

    use strict; use warnings; sub yaya { return " ha \n"; } my $foo = "bar"; print ($foo, yaya);

    Update:Ok. Took a look at that section of the Camel.
    It's all in the precedence of arguments and functions can be arguments. parens can modify this, but you may need a unary plus to avoid some mistakes It might be worth reading that section a few more times.