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 但是在上面的场景中,由于我的哈希键是 AT 而不是 TA,它不会运行。解决此问题的一种方法是添加另一个键值:TA => "M"。但是我不能对所有的键值对都这样做,因为有太多的可能性。

那么有没有更好的方法来解决这个问题??

谢谢..

4

2 回答 2

1

我猜你的意思是括号中的东西的顺序是不重要的,所以AT等同于TATAG等价于TGA等。

[请注意,另一个 Eric 做出了不同的猜测。你不是很清楚你想要什么。]

你可以对字母进行排序。

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 回答