我有一个函数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);
}
Run Code Online (Sandbox Code Playgroud)
给出输出:
Hi
1
1
Hi
Run Code Online (Sandbox Code Playgroud)
为什么在某些情况下和"Hi"其他情况下会得到1 ?
返回表达式在与函数本身相同的上下文中进行计算.这是一个非常全面的列表,列出了标量上下文中的内容.
适用于此:
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];
}
Run Code Online (Sandbox Code Playgroud)
如果你想要聪明,你也可以使用以下内容,因为标量上下文中的切片返回最后一个元素,如果在列表上下文中返回的话:
sub func {
my @a = ...;
return @a[0..$#a];
}
Run Code Online (Sandbox Code Playgroud)