使用Dumper打印含数组值的哈希为何引发无限递归?
为何Data::Dumper会在each循环中引发无限迭代?
先看问题里的代码:
use Data::Dumper; my %hash1 = ( 'key1' => ['val1'] ); while (my ($key, $value) = each %hash1) { print Dumper \%hash1; }
原因解析
- Perl的
each函数依赖绑定在哈希上的迭代状态来逐个返回键值对,迭代完所有元素后each会返回空,循环正常结束。 Data::Dumper在打印哈希时,内部会遍历哈希的所有键值对,这个过程会重置哈希的迭代器状态。- 于是每次循环里,
each刚拿到一个键值对,Dumper就把迭代器打回初始位置,下一次循环each又会重新拿到第一个键值对,循环永远无法终止,表现出类似“无限递归”的现象(实际是无限循环)。
验证与解决
如果在print Dumper之前调用keys %hash1(keys会显式重置迭代器),或者改用for my $key (keys %hash1)这种不依赖迭代状态的循环方式,就能避免这个问题。
内容的提问来源于stack exchange,提问作者Talespin_Kit
相关产品推荐
相关产品推荐

