Perl 如何在这一行中使用条件语句?
我有一个3列的输入文件,我想打印第3列没有被复制的行。因此,如果我的输入数据如下所示: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' 请注意,我并不是在寻找问题的解决方案,因为我是用不同的
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]}++;'