【问题标题】:Can not modify an anonymous hash reference inside a subroutine无法修改子例程内的匿名哈希引用
【发布时间】:2013-11-04 14:44:39
【问题描述】:

我正在尝试通过两个子例程就地修改一组匿名哈希:

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() 通过哈希引用修改数据结构,因此就地。 任何见解将不胜感激,谢谢!

【问题讨论】:

    标签: perl hash reference subroutine


    【解决方案1】:

    您永远不会将$value 分配给任何东西。添加

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

    【讨论】:

    • 非常感谢!我对$value 感到困惑。我想如果$data 是一个引用,那么each() $value 也将是一个引用,并且将指向值,而不是值本身。
    • 您正在考虑别名,而不是参考。即使each 返回了一个别名,您也永远不会分配给该变量,而是分配给$value(它的副本)。
    • 如果它确实返回了一个引用,你必须使用$$value_ref = value_parser($$value_ref)
    猜你喜欢
    • 2012-04-25
    • 2017-04-07
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    相关资源
    最近更新 更多