我有一个简单的脚本试图了解Perl中的哈希.
@H_403_2@#!/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";
我对输出感到惊讶: –
@H_403_2@Iterate upto ggg... -a -> aaa -c -> ccc -g -> ggg Iterate All... -f -> fff -e -> eee -d -> ddd -b -> bbb我知道键是经过哈希处理的,因此第一个输出可以是’n’个元素,具体取决于内部排序.但为什么我之后无法循环播放数组呢?怎么了 ?
谢谢,
@R_301_323@
每个都使用与散列相关联的指针来跟踪迭代.它不知道第一个while与第二个while循环不同,它在它们之间保持相同的指针.
大多数人为了这个(和其他)原因而避免每一个,而是选择密钥:
@H_403_2@for my $key (keys %hash){ say "$key => $hash{$key}"; }这使您可以控制迭代顺序:
@H_403_2@for my $key (sort keys %hash){ say "$key => $hash{$key}"; }无论如何,如果你要提前结束循环,请避免每一个.
BTW,函数式编程倡导者应该借此机会指出隐藏状态的缺点.看起来像无状态操作(“在表中循环每对”)实际上是非常有状态的.