我记得有些事情没有改变
中的键for my $key ( keys %hash ) { ...
例如
for my $key ( keys %hash ) {
$key = "$key_x";
}
但是删除键和更改值就可以了。 我的记忆好吗?
答案 0 :(得分:12)
我认为你记得的是,如果你这样做
for my $item (@array) {
...
}
然后在@array
中间添加或删除项目(例如使用splice
)是不允许的,如果你尝试它的结果是未定义的。事实上,在过去的日子里你可能会以这种方式崩溃perl。
由于keys
返回的列表是副本,因此完全在循环开始时确定,并且从散列中添加和删除键根本不会影响循环。这意味着你可以做像
for my $key (keys %hash) {
$hash{lc $key} = delete $hash{$key};
}
100%安全而不用担心。我可以保证这是真的回到perl 5。6。1(2001年4月),当时“返回的值是副本”的注释被添加到perlfunc,但似乎永远是这样,并且变化只是到文档。
由于循环中的$key
别名为临时列表中的值,因此您可以更改它而不会发生任何错误,但它根本不会对%hash
产生任何影响。
答案 1 :(得分:5)
请参阅keys
函数manpage:
返回的值是散列中原始键的副本,因此修改它们不会影响原始散列。比较“值”。
您可以通过下标删除或更改哈希元素,例如
delete $hash{$key};
$hash{$key} = "foo";
答案 2 :(得分:4)
这样做的方法是
$hash{$newkey} = delete $hash{$oldkey};
答案 3 :(得分:1)
您无法重命名任何键值,而是可以删除并创建一个新值 这不比重命名密钥小! : - )
for my $key ( keys %hash ) {
delete $hash{$key};
$hash{$key} = "$key_x";
}
答案 4 :(得分:0)
但是,如果你想改变密钥名称。
你可以从哈希中删除密钥, 然后使用现有值创建密钥 如你所愿。这可能是一件作品 满足这一要求