perl - 试图理解这个 perl 脚本

标签 perl analysis

这看起来很简单,我想出了大部分。但是看到 perl 的语法松散,新手很难直接跳进去:)

my @unique = ();
my %seen   = ();
foreach my $elem ( @array ) {
    next if $seen{ $elem }++;
    push @unique, $elem;
}

这是来自 perldoc 网站。如果我理解正确,它也可以写成:
my @unique = ();
my %seen   = ();
my $elem;
foreach $elem ( @array ) {
    if ( $seen{ $elem }++ ) {
        next;
    }
    push ( @unique, $elem );
}

所以我此时的理解是:
  • 声明一个名为 unique
  • 的数组
  • 声明一个名为 seen
  • 的哈希
  • 声明一个名为 elem 的变量
  • 迭代@array,每次迭代都存储在$elem
  • 如果 $elem 是散列 %seen 中的一个键(我不知道 ++ 做了什么),跳到下一个迭代
  • 将 $elem 附加到 @unique
  • 的末尾

    我错过了两件事:
  • 什么时候会在 %seen 中存储任何东西?
  • ++ 做什么(在其他所有语言中它都会增加,但我不知道它是如何工作的)

  • 我知道问题出在这部分:
    $seen{ $elem }++
    

    我怀疑这是一次做一堆不​​同的东西。有没有更简单更冗长的写那行的方式?

    谢谢您的帮助

    最佳答案

    ++运算符在 Perl 中的作用与在大多数其他具有它的语言中的作用基本相同:它增加一个变量。

    $seen{ $elem }++;
    

    增加 %seen 中的一个值有,即key为$elem的那个.

    “魔法”是如果 $seen{$elem}还没有被定义,它是自动创建的,就好像它已经存在并且值为 0; ++然后将其设置为 1。所以它相当于:
    if (! exists $seen{$elem}) {
        $seen{$elem} = 0;
    }
    $seen{$elem} ++;
    

    这被称为“自动活化”。 (不,真的,这就是它的名字。)(EDIT2:不,我的错误,不是;正如@ysth 指出的,“autovification”实际上是指出现的引用。见 perldoc perlref。)

    编辑:这是您描述的修订版:
  • 声明一个名为@unique
  • 的数组变量
  • 声明一个名为 %seen
  • 的哈希变量
  • 声明一个名为 $elem
  • 的标量变量
  • 迭代@array,每次迭代都存储在$elem
  • 如果 $elem 是散列 %seen 中的一个键,则跳到下一次迭代
  • 将 $elem 的值附加到 @unique
  • 的末尾
    @unique , %seen , 和 $elem都是变量。标点符号(称为“sigil”)表示它们中的每一个是什么类型的变量,最好将其视为名称的一部分。

    关于perl - 试图理解这个 perl 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6984388/

    相关文章:

    javascript - 如何在 perl 中使用 WWW::Scripter 模块设置引荐来源网址?

    Perl 范围与格式/写入的混淆

    perl - 为什么 encode 删除参数?

    perl - 如何在我的 Perl 程序中创建一个带有历史记录的 shell?

    linux - 确定特定术语的词频

    .net - 如何比较两个 .exe

    android - 尝试使用 Sonarqube 实现分析时没有发生 Gradle 构建

    perl - 使用指定版本的perl

    java - Java数据结构的空间复杂度

    python - 为什么要对单词进行标记/预处理以进行语言分析?