1

我找到了这段代码:

my %seen = ();
my @unique = grep { ! $seen{ $_ }++ } @t_array;

(通过:如何在 Perl 数组中打印唯一元素?

但是,我不明白为什么它会起作用。我知道$_指的是数组中的元素。但是为什么我们需要它++之后呢?

任何答案将不胜感激。

4

2 回答 2

6

$seen{$_}++增加 的值$seen{$_},并计算为原始值。因此,它在第一次看到给定值时评估为零(假),然后每次都评估为正值(真)。第一次看到给定值时为真! $seen{$_}++,此后为假。

 

  1. 迂腐注:从技术上讲,零不是原始值。原始值为“未定义”。但是++在它开始工作之前将 undefined 转换为零,并在完成后返回零。但是无论哪种方式,您实际上都会得到相同的结果,因为 undefined 是假的,就像零一样。
于 2013-11-05T03:22:54.883 回答
1
my @unique = grep { ! $seen{ $_ }++ } @t_array;

相当于

my @unique = grep {

  # have we seen value of $_ yet?
  my $not_seen_yet = ! $seen{ $_ };
  # increment hash value by 1 for $_ key
  $seen{ $_ } += 1;
  $not_seen_yet;

} @t_array;

++自增运算符:

如果放在变量之前,它们在返回值之前将变量递增或递减,如果放在变量之后,则在返回值后递增或递减

于 2013-11-05T06:14:55.703 回答