in reply to Re^2: Hope a subroutine will return undef by default
in thread Hope a subroutine will return undef by default
But the value undef, when evaluated in list context, evaluates to true because it is converted to a list with the singleton value undef. Therefore, a function should not return undef if it might ever be invoked in list context.
Utter nonsense!
"In list context" is almost the opposite of "evaluate to a boolean value". Probably the only tiny grain of truth to that is how "list assignment in scalar context" evaluates to the size of the right-hand list so "return;" is required to exit a loop written like:
while( my( $garthok ) = narfle() ) {
But, of course, you can write (and are more likely to write) that loop like:
while( my $garthok = narfle() ) {
Functions that return more than one value or already return a variable number of values should indeed return an empty list when wanting to convey "false". Functions that only ever return a single value, should usually "return undef;" or "return 0;" rather than be transformed into functions that return a variable number of values.
IME, you are much more likely to get bitten by a "get a scalar" function returning an empty list in lots of different types of code like:
my %hash = ( gnarfle => get1garthok(), tool => a_herring() ); feed( get1garthok(), a_herring(), $spoon );
than to get bitten by deciding to uselessly use a list assignment directly in a conditional expression when dealing with a "get a scalar" function.
Note how the exact problem with doing what the quoted text suggests is that it can easily screw you up when you call it in list context (the opposite of what they claim).
Now, if you want to be able to distinguish "successfully return 'undef'" from "failure which returns nothing", then you might opt for "return;" for the latter case (and you'll have to be extra careful when using such a function).
- tye
|
|---|