Perl正则匹配制表符分隔文件提取3项项集的代码错误排查
错误原因
- 核心错误是正则表达式的匹配规则不符合业务需求:你写的
/[A-Z]\t[A-Z]\t[A-Z]/只会匹配「单个大写字母 + 制表符 + 单个大写字母 + 制表符 + 单个大写字母」的字符串,但你的每个item是由大写字母、数字、下划线组成的多字符字符串,该正则无法匹配到任何符合要求的行。 - 额外可优化点:原正则没有加行首、行尾的匹配约束,就算修改了匹配规则,也可能误匹配到item内容里包含制表符、或者有超过3个item的异常行。
修正方案
更稳妥的实现方式是直接按制表符分割每行,判断分割后的元素数量是否等于3,逻辑更清晰不容易出错,示例代码如下:
#!/usr/bin/perl -w use strict; my $input = shift @ARGV or die $!; open (FILE, "$input") or die $!; while (<FILE>) { chomp; # 按制表符分割,默认自动过滤末尾空元素 my @items = split /\t/; # 元素数量等于3则输出 print $_."\n" if scalar @items == 3; } close FILE;
如果你一定要用正则实现,正确的正则写法如下:
if ($seq =~ /^[^\t]+\t[^\t]+\t[^\t]+$/) { print $seq."\n"; }
这里[^\t]+代表匹配1个及以上非制表符的字符,加上^和$分别约束行首和行尾,确保整行正好是3个用制表符分隔的item。
内容的提问来源于stack exchange,提问作者Olha Kholod
相关产品推荐
相关产品推荐

