从调试器代码访问哈希,而不会破坏程序的“每个”迭代器

时间:2016-06-19 06:37:23

标签: perl intellij-idea hash iterator each

我在访问哈希元素时遇到问题而没有破坏Perl的each迭代器。

根据perldoc,在哈希变量上使用键或值会重置哈希的内部迭代器,由keysvalueseach使用。但它看起来像是简单地复制哈希,就像使用像

这样的东西
%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?

3 个答案:

答案 0 :(得分:2)

一个解决方案是Hash::StoredIterator模块

答案 1 :(得分:2)

更新

请注意,OP的问题是询问如何在调试器中查询正在运行的Perl程序中的变量值,可能是使用-d开关调用

这个解决方案对此没有帮助,但它确实有助于解决明显的问题each有几个问题,除非你确定你的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代码)编写的,应该足够快,足以用于命令行程序