2011-12-13 161 views
3

所以我想写一个子程序,它需要一个哈希参数并向它添加一对键值对(通过引用)。到目前为止,我得到了这个:引用Perl哈希

addParams(\%params); 

sub addParams 
{ 
    my(%params) = %{$_[0]}; #First argument (as a hash) 

    $params{"test"} = "testing"; 
} 

但是由于某种原因,它似乎没有添加'测试'键。我是Perl的新手,但不是这样如何通过引用传递散列?事先感谢。

回答

12

可以使用哈希裁判没有去引用它:

addParams(\%params); 

sub addParams 
{ 
    my $params = shift; 

    $params->{"test"} = "testing"; 
} 

编辑:

为了解决你的代码的问题,当你这样做:

my(%params) = %{$_[0]}; 

你实际制作了%{...}参考文献的副本。您可以通过细分例子来看看这个(无功能,相同的功能):

my %hash = ("foo" => "foo"); 
my %copy = %{ \%hash }; 

$hash{"bar"} = "bar"; 
$copy{"baz"} = "baz"; 

print Dumper(\%hash); 
print Dumper(\%copy); 

运行:

$ ./test.pl 
$VAR1 = { 
      'bar' => 'bar', 
      'foo' => 'foo' 
     }; 
$VAR1 = { 
      'baz' => 'baz', 
      'foo' => 'foo' 
     }; 

两个哈希有原来的“富=>富”,但现在各有各的不同的酒吧/巴兹的。

+0

啊,完美,谢谢! – SuperTron 2011-12-13 21:31:58