为什么数组在子例程开始时移动?
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 分钟试图弄清楚为什么这种转变对子程序至关重要。
$max_so_far
初始化为undef
,程序的运行方式并不完全相同。如果所有输入值都是负数怎么办?
它是初始化函数的返回值以及函数的其余部分可以比较的内容。
请考虑一些方案并跟踪代码。例如,假设它是像这样调用的:
my $max = max(1,2,3);
在 max 中,第一行将 $max_so_far 设置为 1,@_ 变为 (2,3)。现在,当我们运行foreach循环时,我们有一个初始值并避免undef错误。它首先将 $max_so_far 与 2 进行比较,然后将其更新为 2,依此类推。
另一个例子是,如果像这样调用 max:
my $max = max(1);
在 max 中,第一行将 $max_so_far 设置为 1,@_ 变为 ()。当我们点击foreach循环时,它没有什么可迭代的,只返回初始值$max_so_far。
另一个例子是,如果像这样调用 max:
my $max = max();
在 max 中,第一行将 $max_so_far 设置为 undef,因为 @_ 为空。foreach 循环中没有什么可以迭代的,所以函数只返回 undef。