Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl 101子例程和返回值_Perl - Fatal编程技术网

perl 101子例程和返回值

perl 101子例程和返回值,perl,Perl,我不明白这怎么会返回4作为答案。 不确定子程序中发生了什么 sub bar {@a = qw (10 7 6 8);} my $a = bar(); print $a; # outputs 4 在标量上下文中调用子例程。子例程中的最后一条语句是对@a的赋值,它是一个表达式,因此成为隐含的返回值。在标量上下文中,它的计算结果是赋值的右侧返回的元素数(恰好与@a中的元素数相同)。在Perl中,如果没有指定return语句,则子例程的返回值是最后计算的表达式 从文档中: 如果未找到返回,

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



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操作数,数组只计算标量上下文中的元素数,所以这正是您在说赋值“计算为数组长度”时所说的。也许您的意思不同?