0

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

#!/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]and$y[0]是对不同哈希的引用,但在有问题的代码中,$x[0]and$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 回答