如何从Perl中返回数组的函数中获取第一项?

时间:2010-09-16 15:45:29

标签: perl

我有一个返回一个数组的函数,我想从该数组中得到第一个项而不会为数组声明一个变量。基本上,它应该是这样的:

functionReturningArray()[1]

除此之外不起作用。

我真的不想浪费空间来声明整个阵列,因为我不需要它,而且我宁愿不浪费额外的代码行。无论如何要在一行中做到这一点?

3 个答案:

答案 0 :(得分:12)

my $item = (function_returning_list())[0];

函数不能返回数组,它们可以返回数组的内容(即列表)。列表从0开始编制索引,因此函数返回的第一项是(func)[0]。你也可以说

my ($item) = function_returning_list();

这会将function_returning_list置于列表上下文中,并对左侧列表中的变量进行赋值(按顺序)。

重要的是要注意

sub function_returning_list {
    return ("a", "b", "c")
}

my $item = function_returning_list();

可能不会达到您的预期。 $item变量将被指定为"c"。这是因为在标量上下文中没有列表这样的东西。相反,您在标量上下文中有逗号运算符,并在void上下文中计算左手表达式,丢弃结果,然后在标量上下文中计算右侧。

我调用一个序列(而不是一个列表),如果像C风格的for循环一些情况,它会很有用。

答案 1 :(得分:2)

首先,[1]是列表中的第二项,因为Perl使用从0开始的索引。

其次,您需要在列表上下文中评估函数的返回值,以便有一个列表可供访问。

(functionReturningArray())[0]

答案 2 :(得分:2)

比Chas的回答更进一步,没有列表期间的事情。

与具有填充此角色的元组类型的Python不同,Perl的列表完全是编译器/解释器中堆栈的构造。这就是为什么你不能参考列表。

就像python使用元组一样,当使用诸如=赋值运算符之类的构造时,perl会自动推送并移动其堆栈以在变量组周围移动。 (Perl的优先规则是需要括号的,因为=,更紧密。 Perl和Python机制之间的宏观层次差异是上下文在整个表达式中传播。

因此,在标量上下文中,该上下文被分配给每个,运算符,并且运算符在void上下文中执行其左侧,而在标量上下文中执行它的右侧,然后返回。但是在列表上下文中,,运算符将其参数推送到堆栈,所有这些都在列表上下文中执行。然后堆栈通过赋值运算符,然后转移到左值。堆栈/列表本身对Perl级别代码是不可变的,它的修改工具实际上是Perl的所有语法。

因此,虽然在标量上下文中引用列表是不正确的(因为这样的事情不可能发生),但您可以参考列表的行为,如句法结构(由,运算符构造,由数组切片或列表切片)。在标量上下文中,类似构造的列表的行为是返回列表的最后一个元素。如何实现这取决于表达式中的运算符。这当然与标量上下文中返回其长度的数组行为形成对比。

通过一个例子澄清并最终遵守规则并实际回答问题:

假设my @array = (10, 11, 12);

  • 标量上下文

    my $val = (10, 11, 12);        # $val is 12
    my $val = (10 .. 20)[0 .. 5];  # $val is 15      
    my $val = @array;              # $val is 3
    my $val = function();          # $val is the last executed expression
    
    • 因此如果function10, 11, 12结尾,那么该值将为12
    • 如果它是@array,那么该值将为3
    • 如果以10, 11, 12, @array结尾,则值也为3

  • 列出上下文

    my ($val) = (10, 11, 12);        # $val is 10
    my ($val) = (10 .. 20)[0 .. 5];  # $val is 10
    my ($val) = @array;              # $val is 10
    my ($val) = function();          # $val is the first executed expression
                                     # in the last statement.
    
    • 因此如果function10, 11, 12结尾,那么该值将为10
    • 如果它是@array,那么该值将为10
    • 如果以10, 11, 12, @array结尾,则值也为10

  • 并且为了完整性,列出上下文将整个列表抓取到数组中

    my @val = (10, 11, 12);        # @val is 10, 11, 12
    my @val = (10 .. 20)[0 .. 5];  # @val is 10, 11, 12, 13, 14, 15
    my @val = @array;              # @val is 10, 11, 12
    my @val = function();          # @val is the the last executed statement
    
    • 因此如果function10, 11, 12结尾,则@val将为10,11,12
    • 如果它是@array,那么@val将是10,11,12
    • 如果以10, 11, 12, @array结尾,则@val将为10,11,12,10,11,12