0

私はファイルから読んでいます。1 つの列の値に基づいて、独自のクラス/タグをそれに割り当てたいと考えています。

これらの正規表現:

'LTR*','MLT*','MST*' ... はクラス HERV に属します。

'Charlie*','Looper*' ... クラス DNA に属する

現在、正規表現を持つ配列とそれぞれのクラスを持つ配列の 2 つの配列があります。

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

}

もちろん、これはあまり巧妙ではありません。ハッシュの使用を示唆する「この正規表現のグループはこのクラスに属します」と言う方がはるかに良いでしょう。

ただし、ハッシュマップのすべてのキー、次に特定のキーのすべての値よりもすべての行をループするのは非常に不便であり、一致した場合はそのキーを結果のクラス/タグとして使用します。これは良い解決策ですか?

どうもありがとうございました。

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{$_});
}

これにより、正規表現のコンパイルと 1 つのループが節約されます。

于 2013-04-18T13:19:08.597 に答える