我记得有些事情没有改变
for my $key ( keys %hash ) { ...
例如
for my $key ( keys %hash ) { $key = "$key_x"; }
但删除键和更改值将没有问题.
我的记忆好吗?
解决方法
我想你要记住的是,如果你这样做的话
for my $item (@array) { ... }
然后不允许在@array中间添加或删除项目(例如通过使用拼接),如果你尝试它的结果是未定义的.事实上,在过去的日子里,你可能会以这种方式崩溃perl.
由于keys返回的列表是一个副本,因此它完全在循环开始时确定,并且从散列中添加和删除键根本不会影响循环.这意味着你可以做类似的事情
for my $key (keys %hash) { $hash{lc $key} = delete $hash{$key}; }
100%安全无需担心.我可以保证这是真的回到perl 5.6.1(2001年4月),当时“返回的值是副本”的注释被添加到perlfunc,但似乎永远是这样,并且变化只是到文档.
由于循环中的$key别名为临时列表中的值,因此您可以更改它而不会发生任何错误,但它根本不会对%hash产生任何影响.