2

为什么数组在子程序的开头移位?

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 分钟试图弄清楚为什么这种转变对子程序至关重要。)

4

2 回答 2

7

如果您初始化$max_so_farundef. 如果所有输入值都是负数怎么办?

于 2012-08-07T22:35:19.350 回答
3

它是初始化函数的返回值和函数的其余部分可以比较的东西。

考虑一些场景并跟踪代码。例如,假设它是这样调用的:

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。

于 2012-08-07T23:52:44.387 回答