我有一个函数func
,它可以返回单个值或值列表,具体取决于函数的调用方式。因此,对于此特定函数,调用者将知道何时仅期望单个返回值,因此希望使用更简单的语法my $var = func( ... )
而不是my ($var) = func( ... )
。问题是在某些情况下,单个值将转换为具有一个元素的列表/数组的大小,在某些情况下不会。例如:
use feature qw(say);
use strict;
use warnings;
for (1..4) {
no strict 'refs';
my $a = &{"func".$_}();
say $a;
}
sub func1 {
return ("Hi");
}
sub func2 {
my @a = ("Hi");
return @a;
}
sub func3 {
my @a = ("Hi");
return (@a);
}
sub func4 {
my @a = ("Hi");
return (pop @a);
}
提供输出:
Hi
1
1
Hi
为什么我在某些情况下会获得1而在其他情况下会"Hi"
?
答案 0 :(得分:6)
返回表达式在与函数本身相同的上下文中计算。 Here是一个非常全面的列表,列出了在标量上下文中返回的内容。
正如它适用于此:
func1
:字符串文字并不关心上下文。 "Hi"
评估字符串Hi
,因此func1
返回Hi
。
func2
:在标量上下文中,@a
评估@a
中元素的数量,因此func2
返回1
。
func3
:在标量上下文中,@a
评估@a
中元素的数量,因此func3
返回1
。
func4
:pop
并不关心上下文。 pop(@a)
评估已移除的元素(如果@a
为空,则为undef),因此func4
会返回Hi
。
请注意,括号只是覆盖优先级,这对您的任何示例都没有影响。
你想要
sub func {
my @a = ...;
return wantarray ? @a : $a[-1];
}
如果你想要聪明,你也可以使用以下内容,因为标量上下文中的切片返回最后一个元素,如果在列表上下文中返回的话:
sub func {
my @a = ...;
return @a[0..$#a];
}
答案 1 :(得分:2)
来自perldata
:
如果在标量上下文中计算数组,则返回数组的长度。 (请注意,列表不是这样,它返回最后一个值,如C逗号运算符,也不返回内置函数,返回它们返回的任何内容。)
有时您在标量上下文(func2
,func3
)中返回数组的结果,有时是标量上下文(func1
)中字符串文字的结果,有时是结果标量上下文中的pop
(func4
)。因此存在差异。