为什么数组在子程序开始时移位?
sub max {
my($max_so_far) = shift @_;
foreach (@_) {
if ($_ > $max_so_far) {
$max_so_far = $_;
}
}
$max_so_far;
}
只是给$ max_so_far一个初始值吗?该程序与
完全相同 my($max_so_far) = undef;
有没有特别的理由将数组转移到? (我问,因为我花了大约10分钟试图弄清楚为什么这种转变对子程序至关重要。)
答案 0 :(得分:7)
如果您将$max_so_far
初始化为undef
,则程序运行不完全相同。如果所有输入值都是负数怎么办?
答案 1 :(得分:3)
初始化函数的返回值以及函数的其余部分可以比较的内容。
考虑一些场景并追踪代码。例如,假设它是这样调用的:
my $max = max(1,2,3);
在最大值内,第一行将$ max_so_far设置为1,@ _变为(2,3)。现在,当我们运行foreach循环时,我们有一个初始值并避免undef错误。它首先将$ max_so_far与2进行比较,将其更新为2,依此类推。
另一个例子是如果像这样调用max:
my $max = max(1);
在最大值内,第一行将$ max_so_far设置为1,@ _变为()。当我们点击foreach循环时,它没有任何迭代,只返回初始值$ max_so_far。
另一个例子是如果像这样调用max:
my $max = max();
在最大值内,第一行将$ max_so_far设置为undef,因为@_为空。在foreach循环中没有任何东西可以迭代,所以函数只返回undef。