我有以下 Perl 代码。
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
my @array = ( 3, 4, 1, 4, 7, 7, 4, 1, 3, 8 );
my %unordered;
@unordered{@array} = undef;
foreach my $key (keys %unordered) {
print "Unordered: $key\n";
}
my %seen;
my @ordered;
foreach my $element (@array) {
if ( not $seen{$element}++ ) {
push @ordered, $element;
}
}
在最后一个 foreach
代码块中,我无法理解这一点 - 在第一次迭代中,表达式 not $seen{$element}++
的计算结果为 not 0 - 真 - 所以 if block 执行。在第二次迭代中,表达式 not $seen{$element}++
应该再次评估为非 0 - true,因为散列为空。因此,读取标量 $seen{$element}
将读取 0 而不是 0 将评估为 true。因此,if block 应该再次执行。但是,这本书说它在第一次迭代后停止。谁能解释一下?
最佳答案
在第二次迭代中,散列将不再为空,因为 ++
运算符会将 1
放入其中。在第三次迭代中,该值将为 2
(对于此程序而言,它与 1
相同,它仅表示“之前至少看过一次”)。
在您的程序结束时,%seen
将包含每个条目在您的列表中出现的次数。
if $a++
递增 $a
的值(如果缺失则将其视为 0),然后将递增之前的值返回给比较。
使用后缀运算符很重要,因为 if++$a
在这里不起作用:它还在你的散列中放置一个 1
,但它返回修改值(所以 1
即使是第一次迭代)。
关于perl - 我无法理解以下 Perl 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18680639/