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

sid*_*com 3 perl foreach key

我记得有些事情没有改变

for my $key ( keys %hash ) { ...
Run Code Online (Sandbox Code Playgroud)

例如

for my $key ( keys %hash ) {
    $key = "$key_x";
}
Run Code Online (Sandbox Code Playgroud)

但删除键和更改值将没有问题.我的记忆好吗?

hob*_*bbs 13

我想你要记住的是,如果你这样做的话

for my $item (@array) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后禁止在中间添加或删除项目@array(例如通过使用splice),如果你尝试它的结果是未定义的.事实上,在过去的日子里,你可能会以这种方式崩溃perl.

由于返回的列表keys是副本,因此它完全在循环开始时确定,并且从散列中添加和删除键根本不会影响循环.这意味着你可以做类似的事情

for my $key (keys %hash) {
    $hash{lc $key} = delete $hash{$key};
}
Run Code Online (Sandbox Code Playgroud)

100%安全无需担心.我可以保证这是真的回到perl 5.6.1(2001年4月),当时"返回的值是副本"的注释被添加到perlfunc,但似乎永远是这样,并且变化只是到文档.

由于$key在循环中将别名设置为临时列表中的值,因此您可以更改它而不会发生任何错误,但它根本不会产生任何影响%hash.


Eug*_*ash 5

请参阅keys函数联机帮助页:

返回的值是散列中原始键的副本,因此修改它们不会影响原始散列.比较"值".

您可以通过下标删除或更改哈希元素,例如

delete $hash{$key};
$hash{$key} = "foo";
Run Code Online (Sandbox Code Playgroud)