【问题标题】:How can I update a hash value using a hash reference in Perl?如何在 Perl 中使用哈希引用更新哈希值?
【发布时间】:2014-04-13 13:35:52
【问题描述】:

有没有办法使用指向散列值的散列引用来更新散列中的值?

我的哈希输出如下所示:

    'Alternate' => {
        'free' => '27.52',
        'primary' => 'false',
        'used' => '0.01',
        'name' => '/mydir/journal2',
        'size' => '50.00'
     },
    'Primary' => {
        'free' => '60.57',
        'primary' => 'true',
        'used' => '0.06',
        'name' => '/mydir/journal',
        'size' => '64.00'
    }
};

我尝试在哈希中创建对“已使用”属性的哈希引用并尝试更新值:

$hash_ref = \%hash->{"Primary"}->{used};
$hash_ref = "99%";
print $$hash_ref, "\n";

这会更改散列的值,但我得到“第 X 行不推荐使用散列作为参考”。我想知道我正在尝试做的事情是否可行以及我做错了什么。

【问题讨论】:

  • 要访问 'used' 密钥,您可以执行类似 $hash->{Primary}->{used} 或 $hash{Primary}->{used} 的操作(取决于您的外部结构是哈希引用或哈希)。这将返回值 0.06,而不是引用。你想达到什么目的?

标签: perl hash hashref hash-reference


【解决方案1】:
 ...
'Primary' => {
    'free' => '60.57',
    'primary' => 'true',
    'used' => '0.06',
    'name' => '/mydir/journal',
    'size' => '64.00'
}
 ...

尝试像这样绕过弃用问题:

 ...
my $hash_ref = $hash{'Primary'}; # if you declared `%hash = ( .. );`
# Or my $hash_ref = $hash->{'Primary'}; if you declared `$hash = { .. };`
print $hash_ref->{used}; # Prints 0.06
$hash_ref->{used} = '0.07'; # Update
print $href->{used}; # Prints 0.07
 ...

如果您想了解更多信息,请参阅perldsc

【讨论】:

    【解决方案2】:

    您的失败始于您尝试创建对标量的哈希引用。这是一个毫无意义的目标,因为它们是不同的数据类型。作为Filippo already demonstrated,您已经将哈希引用作为更大哈希的值,因此您可以依赖它。

    但是,如果您真的想创建对标量的引用,您只需编辑该值即可。这就是你的做法:

    use strict;
    use warnings;
    
    my $h = {
        'Alternate' => {
            'free' => '27.52',
            'primary' => 'false',
            'used' => '0.01',
            'name' => '/mydir/journal2',
            'size' => '50.00',
         },
        'Primary' => {
            'free' => '60.57',
            'primary' => 'true',
            'used' => '0.06',
            'name' => '/mydir/journal',
            'size' => '64.00',
        }
    };
    
    my $primary = $h->{Primary};
    print $primary->{used}, "\n"; # Outputs 0.06
    
    my $usedref = \$h->{Primary}{used};
    $$usedref = '0.07';
    
    print $primary->{used}, "\n"; # Outputs 0.07
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2015-01-26
      • 2013-08-26
      • 2017-01-06
      • 2023-04-07
      相关资源
      最近更新 更多