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()通過哈希引用修改數據結構,因此就地。 任何有識之士將不勝感激,謝謝!
非常感謝!我對'$ value'感到困惑。我認爲如果'$ data'是一個引用,那麼使用'each()'''value'也將是一個引用,並且將指向該值,而不是該值本身。 –
你在考慮別名,而不是參考。即使'each'返回一個別名,你也不會將該值賦給該變量,而是賦值爲$ value(它的一個副本)。 – ikegami
如果它返回了一個引用,你必須使用'$$ value_ref = value_parser($$ value_ref)'。 – ikegami