0

我正在从文件中读取。基于一列中的值,我想为其分配我自己的类/标签。

这些正则表达式:

'LTR*','MLT*','MST*' ...属于 HERV 类。

'Charlie*','Looper*' ... 属于类 DNA

现在我有两个数组,一个带有正则表达式,一个带有各自的类:

 my @array = map { qr{$_} } ('Alu*', 'HERV*', 'Charlie*' ...
 my @classes = ('Alu', 'HERV', 'DNA', 'LINE' ...

这样我就知道如果我的线与 Charlie* 匹配,它属于类 DNA。

总而言之,对于文件的每一行,我都在循环整个数组并寻找匹配项:

for my $i (0 .. $#array) {

        if ($type =~ m/$array[$i]/) { 
                       my $class=$classes[$i];
        }

}

当然,这不是太聪明。最好说:“这组正则表达式属于这个类”,这表明使用哈希。

但是,我认为循环所有行非常不方便,而不是 hashmap 的所有键,然后是某些键的所有值,并且当匹配时,使用键作为结果类/标签。这是一个好的解决方案吗?

非常感谢你。

4

2 回答 2

2

你可以这样做:

my %re = (
       HERV=>qr/LTR|MLT|MST/,
       DNA=> qr/Charlie|Looper/
   );
my $class;
for (keys %re) {
    $class = $_, last if ($type =~ $re{$_});
}

这将为您节省一些正则表达式编译和一个循环。

于 2013-04-18T13:19:08.597 回答
0

CPAN 模块Text::Prefix::XS似乎可以执行您想要的操作:确定是否有任何前缀列表与给定文本匹配。我没有使用过该模块,但据我所知,您会执行以下操作:

my %prefix2class = ( LTR => 'HERV',
                     MLV => 'HERV',
                     ...
                     Charlie => 'DNA' );

my $search = prefix_search_create( keys %prefix2class );

# ... now, for a given $type, no need to loop ...
my $pfx = prefix_search($search, $type);
my $class = $prefix2class{$pfx};

(注意:在我看来,您的正则表达式就像被怀疑编译为正则表达式的 shell 样式/fnmatch 样式模式,据此我推断您实际上想要简单的前缀匹配。否则,/Charlie*/例如,正则表达式将匹配Charli, Charlieeee,fooCharliebar等开——这似乎不太可能代表你的“一栏中的价值”。)

于 2013-04-18T14:12:45.323 回答