2013-10-25 57 views
2

我試圖修改就地匿名散列,數組內通過兩個子程序:不能修改一個匿名散列引用子程序

my $hashes = [{ 
    foo => 'bar', 
    foobar => 'baz', 
    qux => { 'foo' => 'baz' }, 
}]; 

sub data_parser 
{ 
    my $data = shift; 

    while ((my $key, my $value) = each($data)) { 
      if (ref($value) ne '') { 
        __SUB__->($value); 
      } else { 
        $value = value_parser($value) if ($key eq 'foo'); 
        print "data_parser() ${key}'s new value is: ${value}\n" if ($key eq 'foo'); 
      } 
    } 
} 

sub value_parser { return('newvalue'); } 

foreach my $hash (@{$hashes}) { 
    data_parser($hash); 
    print "foo is " . $hash->{'foo'} . "\n"; 
    print "foo is " . $hash->{'qux'}{'foo'} . "\n"; 
} 

輸出是:

data_parser() foo's new value is: newvalue 
data_parser() foo's new value is: newvalue 
foo is bar 
foo is baz 

我期望value_parser()通過哈希引用修改數據結構,因此就地。 任何有識之士將不勝感激,謝謝!

回答

3

您從未將$value分配給任何東西。 Add

$data->{$key} = $value; 
+0

非常感謝!我對'$ value'感到困惑。我認爲如果'$ data'是一個引用,那麼使用'each()'''value'也將是一個引用,並且將指向該值,而不是該值本身。 –

+1

你在考慮別名,而不是參考。即使'each'返回一個別名,你也不會將該值賦給該變量,而是賦值爲$ value(它的一個副本)。 – ikegami

+2

如果它返回了一個引用,你必須使用'$$ value_ref = value_parser($$ value_ref)'。 – ikegami

相關問題