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”。但我无法对所有键值对执行此操作,因为有太多可能性。
那么有更好的方法来解决这个问题吗?
谢谢..
答案 0 :(得分:1)
我猜你的意思是括号中的东西的顺序并不重要,所以AT
相当于TA
,而TAG
相当于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;
答案 1 :(得分: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;
同样,这两个示例都假设您的所有密钥都可以反转。如果没有,那么你必须手动输入逆转,或者为逆转制定某种选择标准。