我有一个简单的脚本试图了解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";
Run Code Online (Sandbox Code Playgroud)
我对输出感到惊讶: -
Iterate upto ggg...
-a -> aaa
-c -> ccc
-g -> ggg
Iterate All...
-f -> fff
-e -> eee
-d -> ddd
-b -> bbb
Run Code Online (Sandbox Code Playgroud)
我知道键是经过哈希处理的,因此第一个输出可以是'n'个元素,具体取决于内部排序.但为什么我之后无法循环播放数组呢?怎么了 ?
谢谢,
jro*_*way 18
each
使用与散列关联的指针来跟踪迭代.它不知道第一个while与第二个while循环不同,它在它们之间保持相同的指针.
大多数人each
为了这个(和其他)原因而避免,而是选择keys
:
for my $key (keys %hash){
say "$key => $hash{$key}";
}
Run Code Online (Sandbox Code Playgroud)
这使您可以控制迭代顺序:
for my $key (sort keys %hash){
say "$key => $hash{$key}";
}
Run Code Online (Sandbox Code Playgroud)
无论如何,如果你要提前结束循环,请避免each
.
BTW,函数式编程倡导者应该借此机会指出隐藏状态的缺点.看起来像无状态操作("在表中循环每对")实际上是非常有状态的.
gho*_*g74 10
你可以在每个上阅读perldoc
perldoc -f each
Run Code Online (Sandbox Code Playgroud)
当完全读取散列时,在列表上下文中返回空数组(当分配时产生false(0)值),并在标量上下文中返回"undef".之后对"each"的下一次调用将再次开始迭代.每个哈希都有一个单独的迭代器,由程序中的所有"each","keys"和"values"函数调用共享; 它可以通过读取散列中的所有元素,或通过评估"键HASH"或"值HASH"来重置.
因此,您可以使用代码中的密钥%set进行再次迭代(由于您的"最后"语句)
print "Iterate upto ggg...\n";
while ( my ($key, $val) = each %set ) {
print "$key -> $val \n";
last if ($val eq 'ggg');
}
print "\n";
keys %set;
print "Iterate All...\n";
while ( my ($key, $val) = each %set ) {
print "$key -> $val \n";
}
print "\n";
Run Code Online (Sandbox Code Playgroud)