这样做的子程序之间是否存在差异?
return;
Run Code Online (Sandbox Code Playgroud)
还有一个
return undef;
Run Code Online (Sandbox Code Playgroud)
?
yst*_*sth 48
return;将在列表上下文中返回空列表,但undef在标量上下文中. 即使在列表上下文中也return undef;将始终返回单个值undef.
通常,return undef;从列表上下文中通常使用的子例程通常不是一个好主意:
sub foo { return undef }
if ( my @x = foo() ) {
print "oops, we think we got a result";
}
Run Code Online (Sandbox Code Playgroud)
通常,return;从标量上下文中通常使用的子例程通常不是一个好主意,因为它不会像用户在列表上下文中所期望的那样运行:
sub foo { return }
%x = ( 'foo' => foo(), 'bar' => 'baz' );
if ( ! exists $x{'bar'} ) {
print "oops, bar became a value, not a key";
}
Run Code Online (Sandbox Code Playgroud)
这两个错误在实践中都发生了很多,后者更是如此,也许是因为预期返回标量的sub更常见.如果预计会返回一个标量,那么最好返回一个标量.
fri*_*edo 21
特定
sub foo { return; }
sub bar { return undef; }
Run Code Online (Sandbox Code Playgroud)
在标量上下文中,它们的行为相同.
my $foo = foo(); # $foo is undef
my $bar = bar(); # $bar is undef
Run Code Online (Sandbox Code Playgroud)
在列表上下文中,它们的行为不同
my @foo = foo(); # @foo is () (an empty list)
my @bar = bar(); # @bar is ( undef ) (a one-element list)
Run Code Online (Sandbox Code Playgroud)
请注意,单元素列表是布尔上下文中的真值,即使唯一的元素是undef.
一般来说,return undef;从子程序开始通常不是一个好主意,因为它在上下文中的行为方式.