如何在perl哈希中使用键的替换字符作为键呢?

时间:2012-02-16 21:36:10

标签: perl hash key alternate

我的代码:

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”。但我无法对所有键值对执行此操作,因为有太多可能性。

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

谢谢..

2 个答案:

答案 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无法知道密钥ATTA的含义相同,除非您以某种方式告诉它。如果所有序列都可以颠倒,那么你可以做类似的事情:

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

您可能还应检查以确保不覆盖任何现有密钥。

或者,您可以修改正则表达式:

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

同样,这两个示例都假设您的所有密钥都可以反转。如果没有,那么你必须手动输入逆转,或者为逆转制定某种选择标准。