Sea*_*ean 0 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";
Run Code Online (Sandbox Code Playgroud)
输出是:
FINAL, FINAL
SRV, FINAL
Run Code Online (Sandbox Code Playgroud)
为什么,当索引为零时,y [0] - > {name}赋值是否影响x [0] - > {name},但是当索引为1时不会?
谢谢,
肖恩.
那不是你实际运行的代码.在您提供的代码中,$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}.
Run Code Online (Sandbox Code Playgroud)
上述问题可以通过改变来解决
$y[0] = $x[0];
Run Code Online (Sandbox Code Playgroud)
至
$y[0] = { %{ $x[0] } };
Run Code Online (Sandbox Code Playgroud)
要么
use Storable qw( dclone );
$y[0] = dclone( $x[0] );
Run Code Online (Sandbox Code Playgroud)