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_farに初期化すると、プログラムはまったく同じようには実行されませんundef。すべての入力値が負の数値の場合はどうなりますか?

于 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 に更新します。

もう 1 つの例は、max が次のように呼び出された場合です。

my $max = max(1);

max の中では、最初の行で $max_so_far を 1 に設定し、@_ を () にします。foreach ループに到達すると、反復するものは何もなく、初期値 $max_so_far だけが返されます。

もう 1 つの例は、max が次のように呼び出された場合です。

my $max = max();

max の内部では、@_ が空であるため、最初の行で $max_so_far を undef に設定しています。foreach ループで反復するものは何もないため、関数は単に undef を返します。

于 2012-08-07T23:52:44.387 に答える