Perl hashref / property confusion

时间:2012-06-05 20:09:05

标签: perl properties hashref

如果一个人使用严格和警告,忽略这可能不会发生的事实,我想知道为什么这两个案例不同。

#!/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时却不会?

谢谢,

肖恩。

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] );