0

strict と warnings を使用している場合、これはおそらく起こらないという事実を無視して、これら 2 つのケースが異なる理由を知りたいと思います。

#!/usr/local/perl5/bin/perl

$x[0] = "";
$y[0] = "";

$x[0]->{name} = "SRV";
$y[0]->{name} = "FINAL";
print "$x[0]->{name}, $y[0]->{name}\n";

$x[1]->{name} = "SRV";
$y[1]->{name} = "FINAL";
print "$x[1]->{name}, $y[1]->{name}\n";

出力は次のとおりです。

FINAL, FINAL
SRV, FINAL

インデックスがゼロの場合、y[0]->{name} の代入が x[0]->{name} に影響するのに、インデックスが 1 の場合は影響しないのはなぜですか?

ありがとう、

ショーン。

4

1 に答える 1

5

それはあなたが実際に実行したコードではありません。提示したコードでは、$x[0]$y[0]異なるハッシュへの参照ですが、問題のあるコードで$x[0]$y[0]、同じハッシュへの参照です。次のコードのように:

my %hash = { name => "SRV" };
$x[0] = \%hash;           # $x[0] is a reference to %hash.
$y[0] = $x[0];            # $y[0] is a reference to %hash.
$y[0]->{name} = "FINAL";  # Changes $hash{name}.

print $x[0]->{name};      # Prints $hash{name}.
print $y[0]->{name};      # Prints $hash{name}.

上記の問題は、変更することで修正できます

$y[0] = $x[0];

$y[0] = { %{ $x[0] } };

また

use Storable qw( dclone );
$y[0] = dclone( $x[0] );
于 2012-06-05T20:43:28.800 に答える