如何替换 Perl 哈希键?

Posted

技术标签:

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

假设我有这样的哈希:

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

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

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

【问题讨论】:

【参考方案1】:

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

$data->key3key4key6 = delete $data->key3key4key5

会做你想要的。

【讨论】:

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

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

$data->key3key4key6 = $data->key3key4key5;
delete $data->key3key4key5;

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

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

然后调用它:

hash_replace %$data->key3key4, "key5", "key6";

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

hash_replace %$data->key3key4, 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。

【讨论】:

我总是喜欢使用最少数量的->,但我可以看到它是如何快速开始变得毛茸茸的。

以上是关于如何替换 Perl 哈希键?的主要内容,如果未能解决你的问题,请参考以下文章

元素替换 - 红宝石

在 Perl 中如何使用变量作为哈希键?

如何在 Perl 替换运算符的替换端使用变量?

如何递归地分配 perl 多维哈希的键的值,其中该键类似于嵌套键的值?

如何在perl中用'*'替换字符串中的所有字符

如何对 Perl 哈希值进行排序并相应地对键进行排序(可能在两个数组中)?