将数组转换为列表

时间:2016-01-08 20:47:32

标签: arrays perl list scalar

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);

如何将数组转换为值列表?

3 个答案:

答案 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拆分为字符串列表并返回列表   列表上下文,或标量上下文中列表的大小。