[英]How can I replace a Perl hash key?
假设我有这样的哈希:
$data = {
'key1' => {
'key2' => 'value1'
},
'key3' => {
'key4' => {
'key5' => 'value2'
}
},
};
现在,我如何用其他键名替换键“key5”,比如“key6”?
我知道如何遍历散列并转储值,但我不知道如何替换键或值到位。
delete
运算符返回被删除的值。 所以这
$data->{key3}{key4}{key6} = delete $data->{key3}{key4}{key5}
会做你正在寻找的。
您无法替换它,但您可以轻松创建一个新密钥,然后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";
(经过测试并有效)
这“有效”,但它是非常硬编码的。
#!/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 的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.