我有一个函数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"
在其他情况下?
返回表达式在与函数本身相同的上下文中计算。Here http://www.perlmonks.org/?node_id=347416是一个非常全面的列表,列出了标量上下文中返回内容的内容。
正如它适用于此:
func1
: 字符串文字不关心上下文。"Hi"
计算结果为字符串Hi
, so func1
回报Hi
.
func2
:在标量环境中,@a
计算结果为元素的数量@a
, so func2
回报1
.
func3
:在标量环境中,@a
计算结果为元素的数量@a
, so func3
回报1
.
func4
: pop
不关心上下文。pop(@a)
计算结果为删除的元素(或 undef,如果@a
是空的),所以func4
回报Hi
.
请注意,括号只是覆盖优先级,这对您的任何示例都没有影响。
You want
sub func {
my @a = ...;
return wantarray ? @a : $a[-1];
}
如果您想聪明一点,您还可以使用以下内容,因为标量上下文中的切片会返回列表上下文中返回的最后一个元素:
sub func {
my @a = ...;
return @a[0..$#a];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)