为什么要在学习Perl,第6版,第4章的&max子例程示例中移动数组



为什么数组在子例程开始时移动?

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。

最新更新