有没有办法区分一个函数执行时传入参数的方式?例如,当函数被调用时,参数是按值传递还是按引用传递?
return;
还有一个能做到吗?
return undef;
有没有办法区分一个函数执行时传入参数的方式?例如,当函数被调用时,参数是按值传递还是按引用传递?
return;
还有一个能做到吗?
return undef;
return;
在列表上下文中返回一个空列表,但在标量上下文中返回一个undef
。 return undef;
始终会在任何上下文中返回单个值undef
。
通常情况下,从通常用于列表上下文的子程序中return undef;
不是一个好主意:
sub foo { return undef }
if ( my @x = foo() ) {
print "oops, we think we got a result";
}
通常情况下,从标量上下文中的子例程中return;
并不是一个好主意,因为它在列表上下文中不会像用户期望的那样工作:
sub foo { return }
%x = ( 'foo' => foo(), 'bar' => 'baz' );
if ( ! exists $x{'bar'} ) {
print "oops, bar became a value, not a key";
}
这两个错误在实践中经常发生,后者更常见,可能是因为预期返回标量的子程序更常见。如果预期返回标量,则最好返回标量。
给定
sub foo { return; }
sub bar { return undef; }
在标量上下文中,它们的行为相同。my $foo = foo(); # $foo is undef
my $bar = bar(); # $bar is undef
在列表环境中,它们的行为不同
my @foo = foo(); # @foo is () (an empty list)
my @bar = bar(); # @bar is ( undef ) (a one-element list)
需要注意的是,在布尔上下文中,只有一个元素的列表是真值,即使唯一的元素是 undef
。
通常情况下,从子程序中返回 undef;
并不是一个好主意,因为它在上下文中的行为。
Perl::Critic
)建议不要使用return undef
的原因。 - hillufoo(1, bar(), 2)
中使用它。如果bar
写成了return;
,那么你会感到惊讶;-) - Hynek -Pichi- Vychodil我认为我仍然同意PBP。
1)应避免嵌套函数调用:
my $result = bar();
foo(1, $result, 2);
2) 当进行“复杂”的操作时,您应始终明确说明:
foo(1, scalar bar(), 2);
get_values
函数旨在在列表上下文中使用,因此不应该 return undef
。但是如果你有一个返回标量的 get_value
函数,它应该始终返回标量,而不是空列表,因此应使用 return undef
。请参见 ysth 的答案。 - cjmreturn;
而不是return undef;
,因为后者在列表上下文中返回一个单元素列表(其他答案已经提到了这一点)。根据该书的说法,这将是一个“恶心的错误”。my $foo = 5; return !$foo;
返回q()
。!$foo
是空字符串,因为Perl使用1表示真,空字符串表示假。由于有!
,所以您处于布尔上下文中。 - Andy Lester