这个Perl单线程所需的解释

时间:2013-04-03 06:19:18

标签: perl

我在Perl中尝试删除重复的条目。说

File : abc
11
22
11
11
22
33

输出应为:

11
22
33

Perl one-liner使我的工作变得轻松。但我无法理解。它是:

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

根据一些基本知识,我认为“abc的输出是逐行传递的,他们正在将它推入哈希......但-ne代表什么?为什么他们使用{{1什么是++语句?解释是什么?

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

or

4 个答案:

答案 0 :(得分:3)

到目前为止你是对的。这会将文件abc传递给使用哈希的perl命令。要理解-ne参数,请将其与此代码进行比较,该代码非常相同,

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

为明确起见,我还将print更改为print $_

现在这个单行工作的原因是因为当通过执行$H{$_}++递增哈希中的键值时,我们得到键的相关值的返回值。

我们第一次遇到密钥(来自abc的行)时,其在散列中的值默认为0。因此,or子句尚未满足,它将继续到print $_(打印行)。但是在随后的任何时候我们遇到一个键,它的返回值将是>0,因此or子句将短路,因为Perl中的任何正整数都计算为{{1} }。

值得注意的是,如果我们这样写,那么这个单行将无效

true

那是因为我们预先递增并且在我们递增之后将返回

答案 1 :(得分: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,否则后递增。第一次($ H {$ _} ++)被评估为false,因此Perl执行右或右句。它与:

相同
print $_ unless $H{$_}++;

答案 2 :(得分:0)

开关ne表示:

  

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

     

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

这就是如何处理逐行输出。

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

为了找到ocncences的数量,我不确定使用perl one liner,脚本会很容易。

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

cat abc |sort | uniq -c

答案 3 :(得分:0)

计数示例:

cat abc | perl -nle'$H{$_}++ ; END { for (keys %H) { print "$_ - $H{$_}" } }'