gpt4 book ai didi

perl - 为什么 Perl 的 each() 不第二次遍历整个散列?

转载 作者:行者123 更新时间:2023-12-04 13:03:00 25 4
gpt4 key购买 nike

我有一个简单的脚本试图了解 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”个元素,具体取决于内部排序。但是为什么我不能在之后循环数组?怎么了 ?

谢谢,

最佳答案

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

大多数人避免each出于这个(和其他)原因,而不是选择 keys :

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

这也使您可以控制迭代顺序:
for my $key (sort keys %hash){
say "$key => $hash{$key}";
}

无论如何,如果您要提前结束循环,请避免 each .

顺便说一句,函数式编程倡导者应该借此机会指出隐藏状态的缺点。看起来像无状态操作(“遍历表中的每一对”)实际上是有状态的。

关于perl - 为什么 Perl 的 each() 不第二次遍历整个散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1123693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com