han*_*nsi 2 perl hash reference subroutine
为什么第二次调用printHash时哈希是空的?
my %hash = ();
addToHash(\%hash);
printHash(\%hash);
sub addToHash {
my %hash = %{$_[0]};
$hash{"test"} = "test";
printHash(\%hash);
}
sub printHash {
print "printHash: \n";
my %hash = %{$_[0]};
foreach my $key (keys %hash) {
print "key: $key, value: $hash{$key}\n";
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
printHash:
关键:测试,价值:测试
printHash:
在
sub addToHash {
my %hash = %{$_[0]};
$hash{"test"} = "test";
printHash(\%hash);
}
Run Code Online (Sandbox Code Playgroud)
my %hash创建一个新的哈希,您可以复制该参数引用的哈希值.你要
sub addToHash {
my $hr = $_[0];
$hr->{"test"} = "test";
printHash($hr);
}
Run Code Online (Sandbox Code Playgroud)
为了修改原始哈希.
因为该addToHash函数正在向第一个变量的副本添加键值对%hash.
my %hash = %{$_[0]}
Run Code Online (Sandbox Code Playgroud)
取消引用哈希引用,$_[0]但赋值my %hash创建哈希内容的新副本.如果要addToHash影响输入哈希引用,仍需要将其作为哈希引用使用:
sub addToHash {
my $hashref = $_[0];
$hashref->{"test"} = "test";
printHash( $hashref );
}
Run Code Online (Sandbox Code Playgroud)
尝试这个练习来了解使用散列和散列引用之间的区别.
%a = (foo => "bar"); # hash
$b = { foo => "bar" }; # reference to hash
%c = %a; # new copy of a hash
$c{"foo"} = "baz"; # changes the copy of %a, but not %a
print $a{"foo"}; # still outputs "bar"
$d = $b; # $d is reference to same hash that $b points to
$d->{"foo"} = "baz"; # changes $b
print $b->{"foo"}; # now outputs "baz"
$e = \%a; # $e is a reference to hash %a
$e->{"foo"} = "baz"; # changes %a
print $a{"foo"}; # now outputs "baz"
Run Code Online (Sandbox Code Playgroud)