Perl hashref/property confusion

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时不会?

谢谢,

肖恩.

ike*_*ami 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}.
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)