perl 101子程序和返回值

时间:2013-08-12 18:18:40

标签: perl

我不明白这将如何作为答案返回4。 不确定子程序中发生了什么。



sub bar {@a = qw (10 7 6 8);}
my $a = bar(); 
print $a; 

# outputs 4

3 个答案:

答案 0 :(得分:12)

在标量上下文中调用子例程。子例程中的最后一个语句是@a的赋值,它是一个表达式,因此成为隐含的​​返回值。在标量上下文中,这将评估赋值右侧返回的元素数(恰好与@a中的元素数相同)。

答案 1 :(得分:5)

每个子程序的返回表达式(即return语句的操作数和子语句的任何最终表达式)都在与子程序调用本身相同的上下文中进行计算。

sub f {
    ...
    return THIS if ...;
    return THIS if ...;
    ...
    if (...) {
        ...
        THIS
    } else {
        ...
        THIS
    }
}

在这种情况下,返回表达式是一个列表赋值。 (@aqw是赋值的操作数,因此在赋值之前进行求值。)标量上下文中的列表赋值求值为其右侧评估的元素数。

请参阅Scalar vs List Assignment Operator

答案 2 :(得分:3)

在Perl中,如果没有指定return语句,则子例程的返回值是最后一个表达式。

来自perlsub文档:

  

如果没有找到返回,并且最后一个语句是表达式,则为   返回值。如果最后一个语句是循环控制结构   像foreach或while,返回值未指定。该   empty sub返回空列表。