看起来非常简单,我已经理解了大部分。但由于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 }++
我怀疑那一行代码在同时执行多项操作。是否有更简洁、更易懂的方式来书写它?
感谢您的帮助。
$hash{$key} ++;
将未定义或不存在的$hash{$key}
视为0,而$hash{$key} .= "foo";
则将其视为空字符串。另外需要注意的是,“未定义的”和“不存在的”这两个概念略有不同;perldoc -f exists
可以了解详情。 - Keith Thompson