I remember this particular factiod because it has bothered me in the past that the return value of if isn't more clearly documented
Because it's not an expression. Expressions evaluate to a value, not statements. Nothing ever wants the value of an if statement.
Quote perlsub (for subs, but the same applies to do BLOCK):
If no return is found and if the last statement is an expression, its value is returned. If the last statement is a loop control structure like a foreach or a while, the returned value is unspecified. The empty sub returns the empty list.
An if statement isn't a "loop control structure", but more importantly, it's not an expression either. One shouldn't place an if statement as the last statement of a block from which we expect a value.
That said, people do use if statements that way, and the result has been quite predictable. (Update: Mostly predictable. Exception) The last expression evaluated during the course of the processing of the if statement is the resulting value.
my $x = 1; if ($x) { f(); # f() is the last expression evaluated. } else { g(); }
my $x = 0; if ($x) { f(); } else { g(); # g() is the last expression evaluated. }
my $x = 0; if ($x) { # $x is the last expression evaluated. f(); }
my $x = 0; if ($x == 1) { f(); } elsif ($x == 2) ( # $x==2 is the last expression evaluated. g(); }
The same goes for while statements, until statements, and bare loops ({ }). Foreach loops are obviously different (since the iterator is hidden from us).
Updated
In reply to Re^4: printing unitialized value of the 'do BLOCK'
by ikegami
in thread printing unitialized value of the 'do BLOCK'
by rsFalse
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |