Как использовать альтернативные символы ключей в хешах perl в качестве ключей? - PullRequest
0 голосов
/ 17 февраля 2012

Мой код:

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 ]

1 голос
/ 17 февраля 2012

Полагаю, вы имеете в виду, что порядок содержимого в скобках не важен, поэтому AT эквивалентно TA, TAG эквивалентно TGA и т. Д.

[Обратите внимание, что другой Эрик сделал другое предположение. Вы не очень понимали, что вы хотели. ]

Вы можете отсортировать буквы.

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;
0 голосов
/ 17 февраля 2012

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;  

Снова оба примера предполагают, что все ваши ключи могут быть изменены на обратные.Если нет, то вам придется либо ввести сторнирование вручную, либо разработать какой-то критерий выбора для сторнирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...