我记得一些关于不改变键在更改键“(键%哈希){}” - 环
for my $key (keys %hash) { ...
例如
for my $key (keys %hash) {
$key = "$key_x";
}
但删除键和改变值会很好。 我的回忆可以吗?
我记得一些关于不改变键在更改键“(键%哈希){}” - 环
for my $key (keys %hash) { ...
例如
for my $key (keys %hash) {
$key = "$key_x";
}
但删除键和改变值会很好。 我的回忆可以吗?
我想你记住的事实是,如果你做
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
产生任何影响。
但是,如果您想更改密钥名称。
您可以从散列中删除密钥,然后使用 创建存在值的密钥。这可能是一个工作 围绕这一要求
见keys
功能manpage:
返回的值是哈希原密钥的副本,所以修改它们不会影响原哈希值。比较“值”。
您可以通过下标(例如,下划线)删除或更改散列元素。
delete $hash{$key};
$hash{$key} = "foo";
你不能重命名任何键值改为你可以删除,并创建一个新的 这是不是比重命名一个关键较小! :-)
for my $key (keys %hash) {
delete $hash{$key};
$hash{$key} = "$key_x";
}
做的方式,这将是
$hash{$newkey} = delete $hash{$oldkey};
或者sid_com记住了...(...每个%散列){...修改%散列...} – ysth 2010-03-12 16:07:38
谢谢。只是在寻找这些信息。 – 0xC0000022L 2011-06-14 17:05:45