Dear Monks,
Having nothing better to do, I wondered whether that "last expression" that is returned by non-empty subroutines according to perlsub is well-defined. So I tested my understanding of that corner of the docs with these one-liners:
% perl -wle 'sub foo { 1 for @_ } print 2 if defined foo()' % perl -wle 'sub foo { 1 for @_ } print 2 if defined foo(3)' 2 % perl -wle 'sub foo { 1 for @_ } print 2 if foo(3) == 0' 2 % perl -wle 'sub foo { 1 for @_ } print 2 if foo(3) eq ""' 2
and I am puzzled. I guess the difference between the first and the rest have to do with the underlying implementation, though I don't actually know it. From a conceptual point of view I wouldn't have been able to predict that behaviour.
Then, IF the same value is returned always in the rest of the cases, I don't understand how can it be at the same time defined, == 0, and eq "" (edited: and not issue the warning Argument "" isn't numeric in numeric eq (==) ...).
So, is "the last expression" well-defined albeit not always apparent? Are those one-liners just showing unespecified behaviour (which would be a valid answer to my original question)?
-- fxn
PS1: To make things more interesting someone in MagNet#perl pointed out that if you change the 1 with a 43 something different a warning is issued:
% perl -wle 'sub foo { 43 for @_ } print 2 if defined foo()' Useless use of a constant in void context at -e line 1.
PS2: I have posted this question in a few places before, but got no definitive answer yet.
In reply to "last expression" quiz by fxn
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |