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