如果一个人使用严格和警告,忽略这可能不会发生的事实,我想知道为什么这两个案例不同。
#!/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时却不会?
谢谢,
肖恩。
答案 0 :(得分: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] );