请考虑以下简单示例:
#!perl -w
use strict;
sub max {
my ($a, $b) = @_;
if ($a > $b) { $a }
else { $b }
}
sub total {
my $sum = 0;
foreach (@_) {
$sum += $_;
}
# $sum; # commented intentionally
}
print max(1, 5) . "\n"; # returns 5
print total(qw{ 1 3 5 7 9 }) . "\n";
根据Learning Perl(第66页):
“最后评估的表达式”实际上意味着最后一个表达式 Perl计算,而不是子例程中的最后一个语句。
有人可以解释为什么total
没有直接从25
返回foreach
(就像if
一样)吗?我添加了额外的$sum
作为:
foreach (@_) {
$sum += $_;
$sum;
}
我有这样的警告信息:
在void上下文中无用的私有变量......
然而,return
的明确使用按预期工作:
foreach (@_) {
return $sum += $_; # returns 1
}
答案 0 :(得分:15)
来自perlsub:
如果没有找到返回,并且最后一个语句是表达式,则为 返回值。如果最后一个语句是循环控制结构 像foreach或者while,返回的值是未指定的。