0

我在 Perl 中尝试了一个程序来删除重复的条目。说

File : abc
11
22
11
11
22
33

输出应该是:

11
22
33

Perl单行程序使我的工作变得轻松。但我无法理解。它的:

cat abc | perl -ne '$H{$_}++ or print'

有了一些基本知识,我假设“ abc 的输出正在逐行传递,他们正在将其推入哈希中......但是-ne代表什么?他们为什么使用++or声明是什么?解释是什么?

有没有办法我也可以找到出现的次数?

11 - 3
22 - 2
33 - 1
4

4 回答 4

3

到目前为止,您是正确的。这会将文件通过管道传输abcperl使用哈希的命令。要理解这个-ne论点,请将其与几乎等效的代码进行比较,

while (<>){
    $H{$_}++ or print $_
}

明确地说,我也print改为print $_.

现在这种单线工作的原因是因为当通过做增加哈希中键的值时$H{$_}++,我们得到了键关联值的返回值。

当我们第一次遇到一个键(来自 的行abc)时,它在哈希中的值默认为0。因此,该or子句尚未满足,它将继续print $_(打印该行)。但是在任何后续我们遇到一个键时,它的返回值都会是>0,因此or子句会短路,因为 Perl 中的任何正整数的计算结果都是true

有趣的是,如果我们这样写,这个单行将不起作用:

cat abc | perl -ne '++$H{$_} or print'

那是因为这里我们是预递增的,递增会返回值。

于 2013-04-03T07:07:12.637 回答
3

命令行选项 -n 围绕您的 -e 代码循环。如果您键入以下内容:

  $ perl -n -e 'some code' file

然后 Perl 会将其解释为:

  LINE:
    while (<>) {
      # your code goes here, each iteration reads 
      # from file and puts into $_ variable
    }

您的示例中的文件是 cat 命令的管道输出。

$H{$_}++ or print $_;

这将创建一个以文件行作为键的哈希。如果键不存在,它分配 1 值,否则后递增 in。第一次 ($H{$_}++) 被评估为 false,因此 Perl 执行 or-right 语句。它与以下内容相同:

print $_ unless $H{$_}++;
于 2013-04-03T07:10:57.083 回答
0

计数示例:

cat abc | perl -nle'$H{$_}++ ; END { for (keys %H) { print "$_ - $H{$_}" } }'
于 2013-04-03T07:30:16.757 回答
0

开关的ne意思是:

-e = 此命令行开关允许您从命令行运行代码,而不必将程序写入文件然后执行它。

-n = 这个命令行开关允许你对标准输入的每一行运行一个程序(通常用 -e 指定)。

所以这就是逐行输出的处理方式。

现在,如果新值出现,则对于散列,因为它不存在被打印,但下一次递增并且由于 or 条件而不会打印该值。

为了找到出现的次数,我不确定用 perl 做一个衬里,脚本会很容易。

你也可以非常简单地在 linux 中使用 sort 和 uniq:

cat abc |sort | uniq -c
于 2013-04-03T07:27:20.327 回答