0

パフォーマンスを向上させるために、ハッシュの参照を別のモジュールで定義されたサブルーチンに渡そうとしています。この他のモジュールのサブルーチンでは、参照は次のように逆参照されます。

sub subRoutine{
    my $hash_ref = $_[0];
    my %hash = %$hash_ref;

    $hash{$a_key} = $a_value;
}

したがって、これはこのモジュールのそのキーの値を変更しますが、このサブルーチンが呼び出されるperlプログラムの値は変更しません。理由は何ですか?どうすればこれを回避できますか?パフォーマンスを向上させるために、ハッシュを渡す/ハッシュを返す代わりに参照を使用するのは正しいですか?

前もって感謝します!幸運をお祈りしています!

4

3 に答える 3

4

ローカル コピーに逆参照しないでください。参照を使用してください。

$hash_ref->{$a_key} = $a_value;
于 2013-01-20T20:47:10.333 に答える
4

ここで行っているように、元の変数を操作したい場合は、参照を渡すことで問題ありません。問題は、参照されたハッシュのコピーをすぐに作成し、そのコピーを操作していることです。

my %hash = %$hash_ref;は新しいハッシュを作成し、元のハッシュからすべてのキーと値のペアをコピーしています。このコピーを変更しても、オリジナルには影響しません。

その行を取り除き、その行を に置き換えて$hash{$a_key} = $a_value;ください$hash_ref->{$a_key} = $a_value;。元のハッシュの要素を参照し、それを変更しています。

于 2013-01-20T20:49:27.427 に答える
3

と言うときは%hash = %$hash_ref、それをローカル コピー (サブルーチン スコープ) に逆参照しています。サブルーチンに渡したハッシュの値を変更したい場合は、

$hash_ref->{$a_key} = $a_value.

于 2013-01-20T20:48:14.657 に答える