gpt4 book ai didi

perl - 我无法理解以下 Perl 代码

转载 作者:行者123 更新时间:2023-12-02 01:58:16 24 4
gpt4 key购买 nike

我有以下 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/

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