【问题标题】:How can I replace a Perl hash key?如何替换 Perl 哈希键?
【发布时间】:2010-12-02 04:47:03
【问题描述】:

假设我有这样的哈希:

$data = {
    'key1' => {
                'key2' => 'value1'
              },
    'key3' => {
                'key4' => {
                            'key5' => 'value2'
                          }
              },
};

现在,我如何将键“key5”替换为其他键名,例如“key6”?

我知道如何遍历哈希并转储值,但我不知道如何替换键或值。

【问题讨论】:

    标签: perl hash replace


    【解决方案1】:

    delete 运算符返回被删除的值。所以这个

    $data->{key3}{key4}{key6} = delete $data->{key3}{key4}{key5}
    

    会做你想要的。

    【讨论】:

    • 谢谢你。实际上我什至不知道可以这样做
    • 语法高亮似乎关闭了。也许使用lang-none
    【解决方案2】:

    你不能替换它,但你可以很容易地制作一个新的密钥,然后delete()旧的:

    $data->{key3}{key4}{key6} = $data->{key3}{key4}{key5};
    delete $data->{key3}{key4}{key5};
    

    当然,您可以创建一个相当简单的子例程来执行此操作。但是,我的第一种方法是错误的,您需要采用更复杂的方法来传递要修改的数据结构和要修改的元素,并且考虑到您想要几个层次的元素,这可能会很困难。虽然如果你不介意有点混乱:

    sub hash_replace (\%$$) {
      $_[0]->{$_[2]} = delete $_[0]->{$_[1]}; # thanks mobrule!
    }
    

    然后调用它:

    hash_replace %{$data->{key3}{key4}}, "key5", "key6";
    

    或者很酷的方式(说我们将“key5”转换为“key6”更好?):

    hash_replace %{$data->{key3}{key4}}, key5 => "key6";
    

    (经过测试和工作)

    【讨论】:

    • 这很好,感谢您的帮助。这个例子真的很适合我理解如何处理这个问题。
    • 语法高亮似乎关闭了。也许使用lang-none
    【解决方案3】:

    这“有效”,但它是非常硬编码的。

    #!/bin/perl -w
    use strict;
    
    my $data = {
        'key1' => {
            'key2' => 'value1'
        },
        'key3' => {
            'key4' => {
                'key5' => 'value2'
            }
        },
    };
    
    print "$data->{key3}->{key4}->{key5}\n";
    
    my $save = $data->{key3}->{key4}->{key5};
    delete $data->{key3}->{key4}->{key5};
    $data->{key3}->{key4}->{key6} = $save;
    
    print "$data->{key3}->{key4}->{key6}\n";
    

    您可以消除哈希下标之间的 '->' 运算符,但不能消除 '$data' 之后的运算符 - 如 Chris Lutz's solution

    【讨论】:

    • 我总是喜欢使用最少数量的->,但我可以看到它是如何快速开始变得毛茸茸的。
    猜你喜欢
    • 2015-04-29
    • 2012-11-11
    • 2020-10-20
    • 2013-12-13
    • 2011-10-27
    • 2021-12-30
    • 2017-01-06
    • 1970-01-01
    相关资源
    最近更新 更多