perl 101子例程和返回值
我不明白这怎么会返回4作为答案。 不确定子程序中发生了什么perl 101子例程和返回值,perl,Perl,我不明白这怎么会返回4作为答案。 不确定子程序中发生了什么 sub bar {@a = qw (10 7 6 8);} my $a = bar(); print $a; # outputs 4 在标量上下文中调用子例程。子例程中的最后一条语句是对@a的赋值,它是一个表达式,因此成为隐含的返回值。在标量上下文中,它的计算结果是赋值的右侧返回的元素数(恰好与@a中的元素数相同)。在Perl中,如果没有指定return语句,则子例程的返回值是最后计算的表达式 从文档中: 如果未找到返回,
sub bar {@a = qw (10 7 6 8);}
my $a = bar();
print $a;
# outputs 4
在标量上下文中调用子例程。子例程中的最后一条语句是对
@a
的赋值,它是一个表达式,因此成为隐含的返回值。在标量上下文中,它的计算结果是赋值的右侧返回的元素数(恰好与@a
中的元素数相同)。在Perl中,如果没有指定return
语句,则子例程的返回值是最后计算的表达式
从文档中:
如果未找到返回,并且最后一条语句是表达式,则其
返回值。如果最后一条语句是循环控制结构
与foreach或while一样,返回值未指定。这个
empty sub返回空列表
每个子例程的返回表达式(即
return
语句的操作数和子例程的任何最终表达式)在与子例程调用本身相同的上下文中进行计算
sub f {
...
return THIS if ...;
return THIS if ...;
...
if (...) {
...
THIS
} else {
...
THIS
}
}
在这种情况下,返回表达式是一个列表赋值。(@a
和qw
是赋值的操作数,因此在赋值之前进行求值。)标量上下文中的列表赋值计算为其右侧求值的元素数
请参见,但没有return语句。return在perl@airnet-我稍微修改了我的答案。@ikegami-我在哪里说过最后一个计算的表达式是
@a
?我说过最后一个语句是对@a
的赋值,而这个(语句)是一个表达式。表达式的值(如您所说,它是RHS值)成为子例程的返回值。关键是,发生这种情况是因为该语句是一个表达式。“数组长度”是指作为赋值表达式值的数组长度(而不是LHS的长度)。数组在标量上下文中计算其长度,在标量中计算它的唯一方法是如果它是返回值。如果你想让我更准确地解释一下你的帖子有什么错误:1)列表赋值操作符不在标量上下文中计算其LHS,2)数组不在标量上下文中计算。3) 数组的计算结果不符合其长度,4)列表赋值运算符的计算结果不符合数组长度。所以是的,你的回答是非常非常错误的。(我刚刚修复了它。)我建议阅读.Context中的“Context”部分!我记得在学习Perl时,关于这个上下文问题,有一句话是这样说的:“这是您在本书中将学到的最重要的一课,事实上,这是您在整个Perl职业生涯中将学到的最重要的一课”。在经历了4个月痛苦的Perl-OTJ之后,我可以保证这个人是明智的。@ikegami-你似乎误读了(我想不是故意的)这个答案和我的答案。尽管您对我们的答案表示不满,但我们都没有说“最后评估的表达式是@a
”。我似乎很清楚,我们都在说最后一个表达式是分配给@a
,这也正是您所说的。你说要考虑<代码>子栏{()= QW(10 7 6 6)}<代码>。我们应该从中得出什么结论?它的行为和我们已经描述的一样?太棒了。@Ted Hopp,您在标量上下文中声明了列表赋值,并返回了标量上下文中LHS的结果。那个例子说明你错了。其余的点都在节点下进行了处理,您也在节点中提出了这些点。如果你想知道到底发生了什么,你应该读我的帖子。[请注意,squiguy删除了不正确的部分(留下了部分答案)。因此,我删除了我之前的评论。]@ikegami-我没有声称标量上下文中的列表赋值返回标量上下文中LHS的结果。你的例子确实表明我这样做是错误的。祝贺您,您已经击落了。@Ted Hopp,数组是赋值的LHS操作数,数组只计算标量上下文中的元素数,所以这正是您在说赋值“计算为数组长度”时所说的。也许您的意思不同?