如何替换 Perl 哈希键?
Posted
技术标签:
【中文标题】如何替换 Perl 哈希键?【英文标题】:How can I replace a Perl hash key? 【发布时间】:2010-12-02 04:47:03 【问题描述】:假设我有这样的哈希:
$data =
'key1' =>
'key2' => 'value1'
,
'key3' =>
'key4' =>
'key5' => 'value2'
,
;
现在,我如何将键“key5”替换为其他键名,例如“key6”?
我知道如何遍历哈希并转储值,但我不知道如何替换键或值。
【问题讨论】:
【参考方案1】:delete
运算符返回被删除的值。所以这个
$data->key3key4key6 = delete $data->key3key4key5
会做你想要的。
【讨论】:
谢谢你。实际上我什至不知道可以这样做 语法高亮似乎关闭了。也许使用lang-none
?【参考方案2】:
你不能替换它,但你可以很容易地制作一个新的密钥,然后delete()
旧的:
$data->key3key4key6 = $data->key3key4key5;
delete $data->key3key4key5;
当然,您可以创建一个相当简单的子例程来执行此操作。但是,我的第一种方法是错误的,您需要采用更复杂的方法来传递要修改的数据结构和要修改的元素,并且考虑到您想要几个层次的元素,这可能会很困难。虽然如果你不介意有点混乱:
sub hash_replace (\%$$)
$_[0]->$_[2] = delete $_[0]->$_[1]; # thanks mobrule!
然后调用它:
hash_replace %$data->key3key4, "key5", "key6";
或者很酷的方式(说我们将“key5”转换为“key6”更好?):
hash_replace %$data->key3key4, key5 => "key6";
(经过测试和工作)
【讨论】:
这很好,感谢您的帮助。这个例子真的很适合我理解如何处理这个问题。 语法高亮似乎关闭了。也许使用lang-none
?【参考方案3】:
这“有效”,但它是非常硬编码的。
#!/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's solution。
【讨论】:
我总是喜欢使用最少数量的->
,但我可以看到它是如何快速开始变得毛茸茸的。以上是关于如何替换 Perl 哈希键?的主要内容,如果未能解决你的问题,请参考以下文章