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

标签 perl

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

相关文章:

perl - 如何在 Perl 中使用 Crypt::PBKDF2 实现 sha-512?

perl - 这段 Perl 代码用外行的话来说是做什么的?

perl - 如何更改 Perl 的 LWP 发送的 HTTP 请求 header 的顺序?

perl - Perl散列是否应始终包含值?

regex - 为什么我的包含转义 $ 的 Perl 单行语句在 Bash 反引号内不起作用?

perl - 使用 perl 检测并删除 PDF 文件中的空白页

java - 用于提取某些 <div> 标记的正则表达式

perl - 在对变量执行 openssh 时无法捕获 stderr-perl

perl - 将 SOAP 响应存储为哈希值

regex - 如何在 Perl 中提取该文件名的部分内容?