如何替换Perl哈希键?

Joh*_*ohn 19 perl hash replace

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

$data = {
    'key1' => {
                'key2' => 'value1'
              },
    'key3' => {
                'key4' => {
                            'key5' => 'value2'
                          }
              },
  };
Run Code Online (Sandbox Code Playgroud)

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

mob*_*mob 46

delete运算符返回被删除的价值.所以这

$data->{key3}{key4}{key6} = delete $data->{key3}{key4}{key5}
Run Code Online (Sandbox Code Playgroud)

会做你想要的.


Chr*_*utz 9

你不能替换它,但你可以轻松地创建一个新密钥,然后delete()是旧密钥:

$data->{key3}{key4}{key6} = $data->{key3}{key4}{key5};
delete $data->{key3}{key4}{key5};
Run Code Online (Sandbox Code Playgroud)

当然,你可以做一个相当简单的子程序来做到这一点.但是,我的第一种方法是错误的,你需要制作一个更复杂的方法来传递数据结构来修改和修改元素,并且假设你想要多个级别的元素,这可能很难.虽然如果你不介意一点点混乱:

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

然后叫它:

hash_replace %{$data->{key3}{key4}}, "key5", "key6";
Run Code Online (Sandbox Code Playgroud)

或者很酷的方式(如何更好地说我们将"key5"转换为"key6"?):

hash_replace %{$data->{key3}{key4}}, key5 => "key6";
Run Code Online (Sandbox Code Playgroud)

(经过测试和工作)