Perl:匹配文件中的正则表达式

Perl: match regex from the file

我有一个制表符分隔的文件,其中包含有关项集的信息。每个项目集由一到三个项目组成:

MTMR14_Q1   NOTCH1_Q3   PRKCD_Q1        
MTMR14_Q1   NOTCH1_Q3   TFRC_Q3     
MTMR14_Q1   NOTCH1_Q3           
MTMR14_Q1           
MTMR14_Q1   PASD1_Q3

我的目标是检索仅包含三个项目的项目集:

MTMR14_Q1   NOTCH1_Q3   PRKCD_Q1        
MTMR14_Q1   NOTCH1_Q3   TFRC_Q3 

我编写了以下代码,但它没有检索任何项集:

#!/usr/bin/perl -w

use strict;

my $input = shift @ARGV or die $!; 

open (FILE, "$input") or die $!;

while (<FILE>) {
    my $seq = $_;
    chomp $seq;
        
    if ($seq =~ /[A-Z]\t[A-Z]\t[A-Z]/) {  
        #using the binding operator to match a string to a regular expression
    
        print $seq . "\n";
    }
}

close FILE;

你能指出我的错误吗?

[A-Z] 匹配单个字母。


跳过不完全包含 3 个字段的行:

next if $seq !~ /^ [^\t]* \t [^\t]* \t [^\t]* \z/x;

[^\t]* 匹配任意数量的非制表符。


跳过不完全包含 3 个非空字段的行:

next if $seq !~ /^ [^\t]+ \t [^\t]+ \t [^\t]+ \z/x;

[^\t]+ 匹配任何一个或多个非制表符。


据推测,您将通过解析行来获取三个字段来跟进。如果是这样,您可以先解析然后检查,如下所示:

my @fields = split /\t/, $seq, -1;

next if @fields != 3;                    # Require exactly 3 fields.

next if ( grep length, @fields ) != 3;   # Requite exactly 3 non-empty fields.