让我们说如果我有这样的哈希:
$data = {
'key1' => {
'key2' => 'value1'
},
'key3' => {
'key4' => {
'key5' => 'value2'
}
},
};
现在,如何将键'key5'替换为其他键名称'key6'?我知道如何循环哈希&转储值,但我不知道如何替换键或值。谢谢你的帮助。
答案 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的解决方案一样。