这看起来很简单,我想出了大部分。但是看到 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 );
}
所以我此时的理解是:
++
做了什么),跳到下一个迭代 我错过了两件事:
我知道问题出在这部分:
$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
都是变量。标点符号(称为“sigil”)表示它们中的每一个是什么类型的变量,最好将其视为名称的一部分。
关于perl - 试图理解这个 perl 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6984388/