sub get_list {
return ("one", "two");
}
sub get_array {
my @a = ("one", "two");
# need to convert @a to list
return @a;
}
my $two = get_list(); # desired, assigns last item in list to scalar
my $count = get_array(); # evaluates array in scalar context, returning a count
在get_array()方法中,我已经创建了一个数组,但我希望将其作为列表返回,以便根据列表规则而不是数组规则进行分配。当然,数组通常以更复杂的方式构建(不是直接从列表中构建)。
我尝试过使用map,希望它会返回一个值列表,但这会得到相同的结果。与拆分/加入相同。
return map { $_ } @a;
return split /,/, join(",", @a);
如何将数组转换为值列表?
答案 0 :(得分:5)
函数可以使用wantarray来确定它们所处的上下文并相应地返回一些内容:
sub get_array {
my @a = ("one", "two");
return wantarray ? @a : $a[-1];
}
答案 1 :(得分:3)
wantarray
的答案使意图明确,这很好。但是,如果你想要一些看起来更像魔术的东西,你可以称之为"使阵列变得更好。为了让人感到迷惑和印象,一片就会做到:
return @a[0..$#a];
答案 2 :(得分:0)
请参阅perlop comma operator
:
二进制“,”是逗号运算符。在标量上下文中,它会评估它 左参数,抛弃该值,然后评估它的权利 参数并返回该值。这就像C的逗号运算符一样。
并查看perldata list value constructors
:
在不需要列表值的上下文中,显示的值 列表文字只是最终元素的值,如同 C逗号运算符。例如,
@foo = ('cc', '-E', $bar);
将整个列表值分配给数组@foo,但
$foo = ('cc', '-E', $bar);
将变量$ bar的值赋给标量变量$ foo。注意 标量上下文中实际数组的值是长度 数组;
来自map docs:
映射EXPR,LIST
评估LIST的每个元素的BLOCK或EXPR(本地设置 $ _ to each elements)和 返回由结果组成的列表值 每次这样的评估。
完美!正是你想要的:
my @arr = ('a', 'b', 'c');
my $result = map "-->$_<--", @arr;
say $result; #=>3 ???
Boo,hoo:
在标量上下文中,[map]返回如此生成的元素总数。
因此,在阅读了Sean的回答后,您可以推测map()
被定义为执行以下等效操作:
return wantarray ? (result1, result2,...,resultN) : N;
split同样如此:
将字符串EXPR拆分为字符串列表并返回列表 列表上下文,或标量上下文中列表的大小。