如何在这个班轮中使用条件?

时间:2011-11-29 16:53:19

标签: perl

我有一个包含3列的输入文件,我想打印第3列未重复的行。所以如果我的输入数据如下所示:

0,1,abc
0,2,abc
0,5,xyz

我会打印:

0,1,abc
0,5,xyz

我最初从下面开始,但它没有产生任何输出。我在这方面做错了什么?

perl -ne '/^[0-9]+,[0-9]+,(.+)/ && ++$a{$1} && print "$_ $a{$1}\n" if $a{$1}>0'

请注意,我不是在寻找解决我问题的方法,因为我用不同的方式对其进行了编码。但我感兴趣的是为什么上述行没有达到我的预期,因为它暴露了我的perl理解中的差距。

4 个答案:

答案 0 :(得分:2)

首先,首先评估postfix if $a{$1} > 0表达式,就像你说的那样

if ($a{$1} > 0) {
    /^"[0-9]+","[0-9]+","(.+)"/ && ++$a{$1} && print "$_ $a{$1}\n"
}

$a{...}(和$1)只会在if块内更新,因此if语句永远不会为真。

另外,你的正则表达式有双引号字符,但你的样本输入没有。那是一个错字吗?

答案 1 :(得分:0)

perl -ne '/^[0-9]+,[0-9]+,(.+)/ && ++$a{$1} ;print "$_" if $a{$1}==1'

您发布的内容,还包括打印$ a {$ 1}的价值。 我认为那是为了调试。

我取出了“\ n”,因为已有1美元的换行符。

如果您想更改它,请在行的开头使用chomp。

虽然使用&&在一条线上是漂亮的,我认为它会 尝试在真正的格式化块中编写perl的好建议。这个会 帮助您学习更好,调试更容易。

看看你的观点,不容易看出

的真正意图
print $_ if $a{$1}>0 

更好的学习方法(在我看来)会有类似的东西 对此:

perl -ne '/^[0-9]+,[0-9]+,(.+)/ and do{
   if ( ! exists $a{$1} ){
     print "$_";
   };
   $a{$1}=1;
}'

答案 2 :(得分:0)

perl -ne 'print "$_ $a{$1}\n" if /^[0-9]+,[0-9]+,(.+)/ && !$a{$1}++'

答案 3 :(得分:0)

perl -ne 'print if !$_{[m/([^,]*)$/]->[0]}++;'