【问题标题】:perl passing hash reference not behaving as expectedperl 传递哈希引用的行为不符合预期
【发布时间】:2016-11-06 22:12:22
【问题描述】:

注意:我有点想通了,看到最后一路

有点晚了,我盯着这段代码看太久了。我终于写了一个简短的测试程序来测试散列并通过引用传递它们,它的行为不像我预期的那样。我确定我缺少一些非常简单的东西......有人能发现它吗?

#!/usr/bin/perl
use Data::Dumper;

my %hash = ();
print "BEFORE ADDING KEYS\n";
print Dumper (\%hash);
test (\%hash, 10);
print "AFTER ADDING KEYS\n";
print Dumper (\%hash);

sub test {

 my %hash = %{$_[0]};
 my $number = $_[1];
 if ($number == 0) { return; }

 print "BEFORE ADDING KEY HASH_REF=$_[0] NUMBER=$number\n";
 print Dumper (\%hash);
 $hash{$number} = $number;
 print "AFTER ADDING KEY\n";
 print Dumper (\%hash);    
 test ($_[0], $number - 1);
}

我希望这段代码将数字 10 加到我的哈希中,但是一旦测试例程完成递归,哈希就会被清除并且不包含任何内容。我错过了什么?这是输出:

BEFORE ADDING KEYS
$VAR1 = {};
BEFORE ADDING KEY HASH_REF=HASH(0xdb82fd0) NUMBER=10
$VAR1 = {};
AFTER ADDING KEY
$VAR1 = {
          '10' => 10
        };
BEFORE ADDING KEY HASH_REF=HASH(0xdb82fd0) NUMBER=9
$VAR1 = {};
AFTER ADDING KEY
$VAR1 = {
          '9' => 9
        };

...

BEFORE ADDING KEY HASH_REF=HASH(0xdb82fd0) NUMBER=1
$VAR1 = {};
AFTER ADDING KEY
$VAR1 = {
          '1' => 1
        };
AFTER ADDING KEYS
$VAR1 = {};

更改这一行:

$hash{$number} = $number;

到:

$_[0]->{$number} = $number;

使一切按预期工作。当我希望这个本地 %hash 指向我最初传递给例程的同一个取消引用的哈希引用时,为什么第一条语句会修改一个新的本地 %hash?

【问题讨论】:

  • Re "为什么第一条语句会修改一个新的本地%hash",当你有两个同名的变量时,只有里面的那个是可见的。因此,更改 %hash 将更改本地的,而不是全局的。

标签: perl hash reference pass-by-reference


【解决方案1】:

一切都按预期进行。您在测试子中的第一条语句复制了传递的哈希:

 my %hash = %{$_[0]};

要改变传递的哈希,您应该使用 hashref,例如:

 my $hashref= $_[0];

 $hashref->{key} = 'val';

这种方法将改变原始哈希,而不是它的副本。

【讨论】:

  • 将 %hash 分配给取消引用的哈希引用对我来说有点直观!
  • 对不起,我的意思是不直观。
猜你喜欢
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 2017-01-06
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多