1

サブルーチンを実行するときに perl が call-by-reference を使用することを読みました。このプロパティをチェックするための簡単なコードを作成しましたが、perl が値渡しであるかのように動作します。

$x=50;
$y=70;

sub interchange {
    ($x1, $y1) = @_;

    $z1 = $x1;
    $x1 = $y1;
    $y1 = $z1;

    print "x1:$x1 y1:$y1\n";
}

&interchange ($x, $y);

print "x:$x y:$y\n";

これにより、次の出力が生成されます。

$ perl example.pl
x1:70 y1:50
x:50 y:70

引数が参照渡しの方法で処理された場合、x は x1 と等しく、y は y1 と等しくなるべきではありませんか?

4

3 に答える 3

8

Perl は常に確実に参照渡しです。@_ は元のパラメーターのエイリアスを保持しているため、ステートメント($x1, $y1) = @_は元の引数値をコピーしています。

perlsub マンページから:

渡されたすべての引数は、配列 @_ に表示されます。したがって、2 つの引数で関数を呼び出した場合、それらは $ [0] と $ [1] に格納されます。配列 @_ はローカル配列ですが、その要素は実際のスカラー パラメータのエイリアスです。特に、要素 $_[0] が更新されると、対応する引数が更新されます (更新できない場合はエラーが発生します)。

于 2014-06-05T15:15:33.210 に答える
-2

私も Perl を始めたばかりで、サブルーチンに渡すものを誤解していると思います。$x と $y を渡すと、$x と $y が設定されているスカラーが渡されます。参照を明示的に渡す必要がありますが、これはたまたまスカラーでもあります (サブルーチンに渡すことが許可されている唯一のものです)。配列とハッシュの場合、それらへの参照を渡す必要があるため、物事が参照渡しであると考えることで、あなたがどこから来たのかを理解しています。

このコードは、探していることを行う必要があります。

#!/usr/bin/perl

$x=50;
$y=70;

sub interchange {
    ($x1, $y1) = @_;

    $z1 = $$x1; # Dereferencing $x1
    $$x1 = $$y1; # Dereferencing $x1 and $y1
    $$y1 = $z1; # Dereferencing $y1

    print "x1:$$x1 y1:$$y1\n";
}

&interchange (\$x, \$y); # Passing references to $x and $y, not their values

print "x:$x y:$y\n";

\$x と \$y を使用して、$x と $y への参照を渡します。次に、サブルーチン内で $$x と $$y を逆参照します。

于 2014-06-05T15:19:49.297 に答える