如何替换Perl哈希键?

时间:2009-09-29 02:55:52

标签: perl hash replace

让我们说如果我有这样的哈希:

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

现在,如何将键'key5'替换为其他键名称'key6'?我知道如何循环哈希&转储值,但我不知道如何替换键或值。谢谢你的帮助。

3 个答案:

答案 0 :(得分:45)

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

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

会做你想要的。

答案 1 :(得分: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";

(经过测试和工作)

答案 2 :(得分: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的解决方案一样。