回报有什么区别; 并返回undef; 在Perl

fri*_*edo 26 perl

这样做的子程序之间是否存在差异?

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;从子程序开始通常不是一个好主意,因为它在上下文中的行为方式.

  • @hillu:这也是为什么有时候使用它的好主意.例如,函数应该返回逻辑(布尔)答案,并且您希望使用另一个函数调用`foo(1,bar(),2)`.如果`bar`会写'return;`你会感到惊讶;-) (6认同)
  • PBP出错的一件事就是其中之一. (5认同)
  • 这就是"Perl Best Practices"(和"Perl :: Critic")建议不使用`return undef`的原因. (4认同)