5

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



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

# outputs 4

4

3 回答 3

12

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

于 2013-08-12T18:19:56.930 回答
5

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

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

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

请参阅标量与列表赋值运算符

于 2013-08-12T19:30:02.870 回答
3

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

来自perlsub文档:

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

于 2013-08-12T18:22:12.870 回答