加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

为什么Perl的each()第二次不遍历整个哈希?

发布时间:2020-12-15 21:58:58 所属栏目:大数据 来源:网络整理
导读:我有一个简单的脚本试图了解Perl中的哈希. #!/usr/bin/perlmy %set = ( -a = 'aaa',-b = 'bbb',-c = 'ccc',-d = 'ddd',-e = 'eee',-f = 'fff',-g = 'ggg');print "Iterate up to ggg...n";while ( my ($key,$val) = each %set ) { print "$key - $val n";
我有一个简单的脚本试图了解Perl中的哈希.
#!/usr/bin/perl

my %set = (
    -a => 'aaa',-b => 'bbb',-c => 'ccc',-d => 'ddd',-e => 'eee',-f => 'fff',-g => 'ggg'
);

print "Iterate up to ggg...n";
while ( my ($key,$val) = each %set ) {
    print "$key -> $val n";
    last if ($val eq 'ggg');
}
print "n";

print "Iterate All...n";
while ( my ($key,$val) = each %set ) {
    print "$key -> $val n";
}
print "n";

我对输出感到惊讶: –

Iterate upto ggg...
-a -> aaa
-c -> ccc
-g -> ggg

Iterate All...
-f -> fff
-e -> eee
-d -> ddd
-b -> bbb

我知道键是经过哈希处理的,因此第一个输出可以是’n’个元素,具体取决于内部排序.但为什么我之后无法循环播放数组呢?怎么了 ?

谢谢,

解决方法

每个都使用与散列相关联的指针来跟踪迭代.它不知道第一个while与第二个while循环不同,它在它们之间保持相同的指针.

大多数人为了这个(和其他)原因而避免每一个,而是选择密钥:

for my $key (keys %hash){
    say "$key => $hash{$key}";
}

这使您可以控制迭代顺序:

for my $key (sort keys %hash){
    say "$key => $hash{$key}";
}

无论如何,如果你要提前结束循环,请避免每一个.

BTW,函数式编程倡导者应该借此机会指出隐藏状态的缺点.看起来像无状态操作(“在表中循环每对”)实际上是非常有状态的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读