为什么在Learning Perl,第6版,ch中的& max子例程示例中移动数组。 4

时间:2012-08-07 22:28:24

标签: perl

为什么数组在子程序开始时移位?

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

2 个答案:

答案 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。