Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 在不中断程序的情况下从调试器代码访问哈希值';s";每一个;迭代器_Perl_Intellij Idea_Hash_Iterator_Each - Fatal编程技术网

Perl 在不中断程序的情况下从调试器代码访问哈希值';s";每一个;迭代器

Perl 在不中断程序的情况下从调试器代码访问哈希值';s";每一个;迭代器,perl,intellij-idea,hash,iterator,each,Perl,Intellij Idea,Hash,Iterator,Each,我在访问散列元素时遇到了一个问题,即在不破坏Perl的每个迭代器的情况下访问散列元素 根据,对哈希变量使用键或值会重置哈希的内部迭代器,由和使用。但它看起来像是简单地复制散列,就像使用 %other_hash = %hash 还重置哈希的迭代器 例如: my %hash = ( 'A' .. 'D' ); my $n; while ( my ( $key, $value ) = each %hash ) { my %otherhash = %hash; print "$

我在访问散列元素时遇到了一个问题,即在不破坏Perl的
每个
迭代器的情况下访问散列元素

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

%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;
}
我正在编写一个调试器,它必须在每一步中或每一步上向IDE提供变量的值。对于散列,调试器必须能够发送元素数及其值

我看到了。

这个模块的一个解决方案是更新 请注意,OP的问题是询问如何从调试器中查询正在运行的Perl程序中的变量值,可能是使用
-d
开关调用的

此解决方案对此没有帮助,但它确实有助于解决明显的问题,即
每个
都有几个问题,除非您确定
while
循环将运行到完成,否则不得使用

雷尼·厄本的演讲很好地解决了这个问题



键列表上使用
for
循环

keys
在列表上下文中返回不受任何影响的完整不可变哈希键列表

如果你更换

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


然后一切都会如你所期望的那样运行

你说你已经看到了这个问题,我认为答案没有问题


我想这正是你想要的。它是使用Perl XS(C代码)编写的,对于命令行程序来说应该足够快

为什么不将代码示例更改为您实际要做的事情呢?我是调试器的作者。不是代码作者。不应该,但确实如此。如果您在每个循环中尝试转储哈希,那么可以猜测默认控制台调试器也会执行相同的操作。注意:问题交叉发布到PerlMonks的“我是调试器作者,而不是代码作者”。然后我认为您的问题具有误导性。您应该打开一个新问题,从我正在编写调试器开始,然后。。。。你的“万一……”一段内容过于密集,信息量过大,很多人都会忽略它。我本以为(正如你在最后一个链接中所描述的那样)正是你想要的for@AlexandrEvstigneev我确实读过你的问题。它甚至没有说明您想要什么——如何在出现损坏的调试器时使用哈希,或者如何修复调试器本身?如果迭代列表(不可变),则不会出现问题,因为它是预先生成的,请参见Borodin的答案。另一方面,也许这个工具太热心了——为什么它要查询循环中的整个散列呢?“当前词汇变量”是循环块中的一个元素。散列就是这样,将这些函数中的任何一个与另一个并发使用都不会很好地工作。如果您阅读问题和注释,您会发现我不是代码的作者,我是调试器的作者。所以我不能修改代码,我只需要使调试器不破坏iterator@AlexandrEvstigneev:那不是一个令人满意的答案。你的问题不仅欺骗了许多人myself@AlexandrEvstigneev但这正是问题的第一个问题,它询问的是代码,而不是调试器。我理解你可能不是这个意思,但最初发布的问题表明。在这篇评论中,你会说我只需要让调试器不破坏迭代器,直到最近编辑了这个问题,这是唯一这样的陈述。请重新阅读您的原始问题。您需要写更多的内容来解释这对您的情况有何帮助关于安全钥匙的小补充。它很慢,速度取决于散列大小;尝试计算5k对中的密钥数哈希100k次:StoredIterator+默认密钥不到一秒钟。安全钥匙用了46秒。
while ( my ( $key, $value ) = each %hash ) {
    ...
}
for my $key ( keys %hash ) {
    my $value = $hash{$key};

    ...
}