Perl 从子例程中的foreach返回值

Perl 从子例程中的foreach返回值,perl,function,return-value,Perl,Function,Return Value,考虑以下简单示例: #!perl-w 严格使用; 次最大值{ 我的($a$b)=; 如果($a>$b){$a} else{$b} } 小计{ 我的$sum=0; foreach(foreach){ $sum+=$\ux; } #$sum;#有意评论 } 打印最大值(1,5)。“\n”;#返回5 打印总数(qw{1 3 5 7 9})。“\n”; 根据(第66页): “最后计算的表达式”实际上是指 Perl求值,而不是子例程中的最后一条语句 有人能解释一下为什么total不能直接从foreach

考虑以下简单示例:

#!perl-w
严格使用;
次最大值{
我的($a$b)=;
如果($a>$b){$a}
else{$b}
}
小计{
我的$sum=0;
foreach(foreach){
$sum+=$\ux;
}
#$sum;#有意评论
}
打印最大值(1,5)。“\n”;#返回5
打印总数(qw{1 3 5 7 9})。“\n”;
根据(第66页):

“最后计算的表达式”实际上是指 Perl求值,而不是子例程中的最后一条语句

有人能解释一下为什么
total
不能直接从
foreach
返回
25
(就像
if
)?我添加了额外的
$sum
,如下所示:

foreach (@_) {
    $sum += $_;
    $sum;
}
我有这样的警告信息:

在无效上下文中无用地使用私有变量

但是,显式使用
返回
的效果与预期一样:

foreach (@_) {
    return $sum += $_; # returns 1
}
发件人:

如果未找到返回,并且最后一条语句是表达式,则其 返回值。如果最后一条语句是循环控制结构 与foreach或while一样,返回值未指定


我现在明白了。感谢您澄清这一点。@Grzegorz顺便说一句,建议始终通过显式
返回
。我认为省略可选的
返回
,更为“Perlish”,但我同意这一建议,因为显式样式通常对程序员来说更为明显。谢谢PBP。@Grzegorz Szpetkowski,不,我不认为有一种强烈的趋势是省略
返回值。有的有,有的没有。我个人不会省略
return
,除非它是一行sub.a
return(无操作数)实际上从未在不返回任何内容的子对象的末尾使用。@Grzegorz Szpetkowski,有人说让
for
返回一些合理的内容,比如主体每次传递所计算的最后一个值的列表,但没有结果。