我该如何替换Perl哈希表的键?

26

假设我有这样一个哈希表:

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

现在,我该如何用其他键名替换“key5”这个键?

我知道如何循环遍历哈希表并输出值,但不知道如何直接替换其中的键或值。

3个回答

55
< p > delete 运算符返回被删除的值。因此,这个

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

这将做到您想要的。


谢谢您。我实际上甚至不知道可以这样做。 - John
语法高亮似乎有些问题。也许应该使用 lang-none - Peter Mortensen

9

您无法替换它,但可以轻松创建一个新密钥,然后使用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";

(测试通过并且可行)

这太棒了,谢谢你的帮助。这个例子对我理解如何处理这个问题非常有帮助。 - John
语法高亮似乎有问题。也许可以使用 lang-none - Peter Mortensen

0

这个“可行”,但它是非常硬编码的。

#!/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的解决方案中一样。


1
我总是喜欢尽可能少地使用 ->,但我可以看出它很快就会变得混乱。 - Chris Lutz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接