我在访问哈希元素时遇到问题而没有破坏Perl的each
迭代器。
根据perldoc
,在哈希变量上使用键或值会重置哈希的内部迭代器,由keys
,values
和each
使用。但它看起来像是简单地复制哈希,就像使用像
%other_hash = %hash
也会重置哈希的迭代器。
例如:
my %hash = ( 'A' .. 'D' );
my $n;
while ( my ( $key, $value ) = each %hash ) {
my %otherhash = %hash;
print "$key=$value\n";
last unless ++$n < 5;
}
C=D
C=D
C=D
C=D
C=D
我正在编写一个调试器,它必须在或中的步骤上为IDE提供变量值。如果是哈希值,调试器必须能够发送元素数量的值。
我见过Can I copy a hash without resetting its "each" iterator?。
答案 0 :(得分:2)
一个解决方案是Hash::StoredIterator模块
答案 1 :(得分:2)
请注意,OP的问题是询问如何在调试器中查询正在运行的Perl程序中的变量值,可能是使用-d
开关调用
这个解决方案对此没有帮助,但它确实有助于解决明显的问题each
有几个问题,除非你确定}否则不能使用} em>你的while
循环将运行完成
Reini Urban Do not use each很好地解决了这个问题
在for
列表
keys
循环
列表上下文中的 keys
返回不受任何影响的哈希键的完整不可变列表
如果您更换
while ( my ( $key, $value ) = each %hash ) {
...
}
与
for my $key ( keys %hash ) {
my $value = $hash{$key};
...
}
然后一切都会按预期工作
答案 2 :(得分:0)
你说你已经看到了问题Can I copy a hash without resetting its "each" iterator?,我认为那里的答案没有错误
我认为Hash::SafeKeys
正是你想要的。它是使用Perl XS(C代码)编写的,应该足够快,足以用于命令行程序