更改“for(keys%hash){}” - 循环中的键

时间:2010-03-12 09:31:54

标签: perl foreach key

我记得有些事情没有改变

中的键
for my $key ( keys %hash ) { ...

例如

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

但是删除键和更改值就可以了。 我的记忆好吗?

5 个答案:

答案 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)

  

但是,如果你想改变密钥名称。

     

你可以从哈希中删除密钥,   然后使用现有值创建密钥   如你所愿。这可能是一件作品   满足这一要求