gpt4 book ai didi

perl - 试图理解这个 perl 脚本

转载 作者:行者123 更新时间:2023-12-01 08:17:34 25 4
gpt4 key购买 nike

这看起来很简单,我想出了大部分。但是看到 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/

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