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

标签 perl foreach key

我记得一些关于不更改 key 的事情

for my $key ( keys %hash ) { ...

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

但是删除键和更改值就可以了。
我的内存还好吗?

最佳答案

我想你记得的是如果你这样做了

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

关于perl - 更改 "for ( keys %hash ) {}"循环中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2431637/

相关文章:

perl - 为什么即使在安装模块后,我仍会收到 "Can' t 定位模块的可加载对象?

php - 递归地倍数 foreach 或 RecursiveIteratorIterator

javascript - 如何遍历 JavaScript 对象的键

MySQL不会使用索引进行查询?

linux - 如何在 Perl 中解析成对数据时转义额外的空行

json - 在centos上安装perl-JSON

Perl try catch 用户定义的异常

PHP session 数组值

PHP 迭代器不能通过引用与 foreach 一起使用

CouchDB 查看排序规则,一键加入,搜索其他值