gpt4 book ai didi

perl - 我可以复制哈希而不重置其 "each"迭代器吗?

转载 作者:行者123 更新时间:2023-12-02 04:10:34 31 4
gpt4 key购买 nike

我正在使用 each 来迭代 Perl 哈希:

while (my ($key,$val) = each %hash) {
...
}

然后发生了一些有趣的事情,我想打印出哈希值。首先我考虑的是这样的:

while (my ($key,$val) = each %hash) {
if (something_interesting_happens()) {
foreach my $k (keys %hash) { print "$k => $hash{$k}\n" }
}
}

但这行不通,因为每个人都知道在哈希上调用keys(或values)会重置用于each的内部迭代器>,我们可能会得到一个无限循环。例如,这些脚本将永远运行:

perl -e '%a=(foo=>1); while(each %a){keys %a}'
perl -e '%a=(foo=>1); while(each %a){values %a}'

没问题,我想。我可以复制哈希值,然后打印出来。

   if (something_interesting_happens()) {
%hash2 = %hash;
foreach my $k (keys %hash2) { print "$k => $hash2{$k}\n" }
}

但这也行不通。这也会重置 each 迭代器。事实上,在列表上下文中使用 %hash 似乎会重置其 each 迭代器。所以这些也永远运行:

perl -e '%a=(foo=>1); while(each %a){%b = %a}'
perl -e '%a=(foo=>1); while(each %a){@b = %a}'
perl -e '%a=(foo=>1); while(each %a){print %a}'

这是否记录在任何地方? Perl 可能需要使用相同的内部迭代器将哈希的内容推送到返回堆栈上,这是有道理的,但我也可以想象不需要这样做的哈希实现。

更重要的是,有什么办法可以做到我想要的吗?要在不重置 each 迭代器的情况下获取哈希的所有元素?

<小时/>

这也表明您也无法在 each 迭代中调试哈希。考虑在以下位置运行调试器:

%a = (foo => 123, bar => 456);
while ( ($k,$v) = each %a ) {
$DB::single = 1;
$o .= "$k,$v;";
}
print $o;

只需检查调试器停止处的哈希(例如,输入 p %ax %a),您就可以更改程序的输出。

<小时/>

更新:我上传了 Hash::SafeKeys 作为此问题的通用解决方案。感谢@gpojd 为我指明了正确的方向,感谢@cjm 提出了使解决方案变得更加简单的建议。

最佳答案

你试过吗Storable's dclone 复制它?大概是这样的:

use Storable qw(dclone);
my %hash_copy = %{ dclone( \%hash ) };

关于perl - 我可以复制哈希而不重置其 "each"迭代器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10921221/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com