Perl 如何在这一行中使用条件语句?

Perl 如何在这一行中使用条件语句?,perl,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' 请注意,我并不是在寻找问题的解决方案,因为我是用不同的

我有一个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理解的差距。

一方面,后缀
if$a{$1}>0
表达式首先得到计算,就像您说的那样

if ($a{$1} > 0) {
    /^"[0-9]+","[0-9]+","(.+)"/ && ++$a{$1} && print "$_ $a{$1}\n"
}
但是
$a{…}
(和
$1
)只会在
if
块中更新,因此
if
语句永远不会为真

另一方面,正则表达式有双引号字符,但示例输入没有。那是打字错误吗

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;
}'

这场比赛永远不会成功。模式需要双引号字符,但数据不包含任何双引号字符。不要说“没用”!!告诉我们发生了什么,没有输出?输出不正确?烟从通风口冒出来?抱歉,我已经修复了双引号问题,并为clarity编辑了它是一个打字错误,为了清晰起见,我删除了双引号。谢谢
perl -ne 'print "$_ $a{$1}\n" if /^[0-9]+,[0-9]+,(.+)/ && !$a{$1}++'
perl -ne 'print if !$_{[m/([^,]*)$/]->[0]}++;'