2010-03-12 73 views

回答

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产生任何影响。

+0

或者sid_com记住了...(...每个%散列){...修改%散列...} – ysth 2010-03-12 16:07:38

+0

谢谢。只是在寻找这些信息。 – 0xC0000022L 2011-06-14 17:05:45

0

但是,如果您想更改密钥名称。

您可以从散列中删除密钥,然后使用 创建存在值的密钥。这可能是一个工作 围绕这一要求

5

keys功能manpage

返回的值是哈希原密钥的副本,所以修改它们不会影响原哈希值。比较“值”。

您可以通过下标(例如,下划线)删除或更改散列元素。

delete $hash{$key}; 
$hash{$key} = "foo"; 
1

你不能重命名任何键值改为你可以删除,并创建一个新的 这是不是比重命名一个关键较小! :-)

for my $key (keys %hash) { 
    delete $hash{$key}; 
    $hash{$key} = "$key_x"; 
} 
+0

abubacker的陈述是正确的(并且重要,并且在接受的答案中没有明确表示),尽管它与循环没有任何关系;为什么downvotes?该示例应该可能是$ hash {$ newkey} = delete $ hash {$ key}。 – ysth 2010-03-12 16:10:26

+0

@ysth以为他一定是个初学者不想迷惑他,有时候我们一定不要总认为我们的观点是我的朋友,希望你会改变倒票:-) – abubacker 2010-03-13 07:42:38

4

做的方式,这将是

$hash{$newkey} = delete $hash{$oldkey};