in reply to Martin Brown book page 33

Actually, I get "FirstSecond2311".

The extra 1s are the return values from the functions first and second. As they don't have explicit return statements, they both return the result of the last expression evaluated. In both cases, that's a call to print. And print returns 1 (i.e. true) if it prints successfully.

For extra credit, explain why it doesn't print "23First1Second1" - which would seem to be the most obvious result.

--
<http://dave.org.uk>

"The first rule of Perl club is you do not talk about Perl club."
-- Chip Salzenberg

Replies are listed 'Best First'.
Re^2: Martin Brown book page 33
by blazar (Canon) on May 16, 2006 at 11:19 UTC
    Actually, I get "FirstSecond2311".
    $ perl -le 'print 0' 0 $ perl -le 'print print 0' 0 1 $ perl -le 'print print print 0' 0 1 1 $ perl -le 'print print print print 0' 0 1 1 1

    Hint: print does have a return value!

Re^2: Martin Brown book page 33
by jhourcle (Prior) on May 16, 2006 at 15:29 UTC
    For extra credit, explain why it doesn't print "23First1Second1" - which would seem to be the most obvious result.

    Because the arguments to print are all evaluated first, then printed. ie, it's effectively:

    @args = (2,3,first,second); print @args;

    So 'first' and 'second' are run (generating output), before the print command w/ the list is performed.

    Similarly, foreach (&func1, &func2) { ... } will run both 'func1' and 'func2' before starting the loop:

Re^2: Martin Brown book page 33
by mnooning (Beadle) on May 17, 2006 at 02:37 UTC
    Yes, FirstSecond2311. Me, too.
    So THAT is where the extra 1s come from!

    To rephrase what blazar, jhourcle and friedo (and the book) pointed out,
    the terms in the main print statements have a higher precedence then
    the plain numbers, and hence get evaluated first. The
    said "terms" are subroutine calls that themselves do
    a print, and that is why we see First and then Second being printed.
    Thanks for the extra credit question, too, as well as
    the answer.

    To comment on adrianh suggesting other books instead,
    the fact is I've read a ton of perl books. The
    debugging book just happens to be one I haven't
    read. In spite of all the Perl books I've read, the
    I could not seem to figure out the answer.
    Thanks again