Is there a difference between a subroutine that does
return;
and one that does?
return undef;
Perl | return() Function return() function in Perl returns Value at the end of a subroutine, block, or do function. Returned value might be scalar, array, or a hash according to the selected context.
The solution that seems to be obvious to many people, especially who are new to Perl, is to explicitly return undef by writing: return undef;.
You can return a value from Perl subroutine as you do in any other programming language. If you are not returning a value from a subroutine then whatever calculation is last performed in a subroutine is automatically also the return value.
return;
will return an empty list in list context but undef
in scalar context. return undef;
will always return a single value undef
even in list context.
In general, it's usually not a good idea to return undef;
from a subroutine normally used in list context:
sub foo { return undef } if ( my @x = foo() ) { print "oops, we think we got a result"; }
In general, it's usually not a good idea to return;
from a subroutine normally used in scalar context, because it won't behave as the user expects in list context:
sub foo { return } %x = ( 'foo' => foo(), 'bar' => 'baz' ); if ( ! exists $x{'bar'} ) { print "oops, bar became a value, not a key"; }
Both of these errors happen quite a bit in practice, the latter more so, perhaps because subs that are expected to return a scalar are more common. And if it's expected to return a scalar, it had better return a scalar.
Given
sub foo { return; } sub bar { return undef; }
In scalar context, they behave the same.
my $foo = foo(); # $foo is undef my $bar = bar(); # $bar is undef
In list context, they behave differently
my @foo = foo(); # @foo is () (an empty list) my @bar = bar(); # @bar is ( undef ) (a one-element list)
Note that a one-element list is a true value in boolean context, even though the only element is undef
.
In general, it's usually not a good idea to return undef;
from a subroutine, because of how it behaves in context.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With