0

私のコード:

use strict;  
use warnings;

my $seq = "ATGGT[TGA]G[TA]GC";  
print "The sequences is $seq\n";  
my %regex = (  
   AG => "R",  
   TC => "Y",  
   GT => "K",  
   AC => "M",  
   GC => "S",  
   AT => "M",  
   CGT => "B",  
   TGA => "D",  
   ACT => "H",  
   ACG => "V",  
   ACGT => "N"  
);  

$seq =~ s/\[(\w+)\]/$regex{$1}/g;  
print "$seq\n";  

私の理想的な出力は次のとおりです。ATGGTDGMGCしかし、上記のシナリオでは、ハッシュキーはTAではなくATであるため、実行されません。この問題を解決する1つの方法は、別のKey-Valueを追加することです:TA=>"M"。しかし、可能性が多すぎるため、すべてのキーと値のペアに対してこれを行うことはできません。

それで、この問題に対処するためのより良い方法はありますか?

ありがとう..

4

2 に答える 2

1

かっこで囲まれたものの順序は重要ではないので、とAT同等であり、などと同等であると推測しています。TATAGTGA

[他のエリックが別の推測をしたことに注意してください。あなたは自分が何を望んでいるのかはっきりしていませんでした。]

あなたは文字を並べ替えることができます。

sub key { join '', sort split //, $_[0] }

my @subs = (
   AG => "R",
   TC => "Y",
   GT => "K",
   AC => "M",
   GC => "S",
   AT => "M",
   CGT => "B",
   TGA => "D",
   ACT => "H",
   ACG => "V",
   ACGT => "N",
);  

my %subs;
while (@subs) {
    my $key = shift(@subs);
    my $val = shift(@subs);
    $subs{ key($key) } = $val;
}

# Die on unrecognized
$seq =~ s/\[(\w+)\]/ $subs{ key($1) } or die $1 /ge;

また

# Do nothing on unrecognized
$seq =~ s/\[(\w+)\]/ $subs{ key($1) } || $1 /ge;
于 2012-02-16T23:23:30.230 に答える
0

Perlには、何らかの方法でキーを指定しない限り、キーATが同じことを意味することを知る方法がありません。TAすべてのシーケンスを逆にすることができる場合は、次のようにすることができます。

for (keys %regex) {
   $regex{reverse $_} = $regex{$_}
}

また、既存のキーを上書きしていないことも確認する必要があります。

または、正規表現を変更することもできます。

$seq =~ s/\[(\w+)\]/$regex{$1} or $regex{reverse $1}
        or die "pattern $1 not found"/ge;  

繰り返しますが、これらの例は両方とも、すべてのキーを逆にすることができることを前提としています。そうでない場合は、反転を手動で入力するか、反転のためのある種の選択基準を作成する必要があります。

于 2012-02-16T21:50:08.497 に答える