我记得有些事情没有改变
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
.
请参阅keys
函数联机帮助页:
返回的值是散列中原始键的副本,因此修改它们不会影响原始散列.比较"值".
您可以通过下标删除或更改哈希元素,例如
delete $hash{$key};
$hash{$key} = "foo";
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3925 次 |
最近记录: |