Могу ли я искать между ключами хэша и присваивать его значение переменной в Perl?

Я хочу использовать функцию substr для восстановления некоторых нуклеотидов в последовательностях. Здесь у меня есть формат FASTA этих последовательностей:

>dvex28051
AAAACAAAAACATTCGCTAGAAAGTAATCAGCTGGTCATTTATTTGAAATGTTAATGATATATTTCATGTTGCTAATTTTTTATGAAAAAAATCATTGCTTATTTAATTACTCTTGGTTCTTGACCAACTATAAAAGCATTGTTTAGTATCAAGTGTCCAGGTATCAGCAGTTTTGTTTGAAAACAAACTTTTATTCATGCAGTCAGTGGCGGATCCAGGTAGAGTGCAGAGGCAGCACCCTCCGTCAGAAAACCAAAAAAAGAAGAAATGAAAAATTATAAAAAAAATTTCTAAACGTTGGTGCACTTAAGTGTAGCAAAAAATTCCTGTTTAGATATTCAGTGGGGAGCGACACCTTTTGGGGCCTATAGCTTCAAATCTTACTTGGTGACCTAAAATCGCTTTTTCGTTGGATCTGCGAAAGCTAGAATTTGGTTGCTGCAAATCGAATCGGTGCATCAACTGCATCAATATCAACGATGTGGTGACTGGTGGTATATTTTGGGTTCGTGCAATGCTACATTTATTTCAATCATATTTCAAGGCAGAAAGGGAAAGAAAACATCAGGTCAAGACAGTGGCGTAGCGAGGGAAGGGGGGCATACGTCCCCGGGCGCAACACGATGTCTTTTTTTTTAATCATCTGCGAAATTCAGACATTTTTTAGAGACTAAATGAAACTATGGAAAACCGGGCCCTTATAAAAGTTGAGACCAAGTGAAAAACTGGGGATAAAACATGAAAATCGGGCTCCAAAAGAATGAGAGTCCGCCCTTGGTCTGTACCAGCATGATTTGAGCGCAAATTTCATTAAGCCCCCGGGCGCAAGACACTCACGCTACGCCCCTGGGTAAAGACAAACAGAGTAGTTTTTCTTATAAACACAAGCATGCACAAACAACATAAAAACAAAACACAGTTTTTTTTAAGACGATGTGCTGCGTGCACCCGCTCAATGTTTTTTTTTTTTTTTTATAGAAAAGCAAAACTTTGAAAGGTTAACGTCAACTCATTTTACAACAATTTGTGGCAAATGGTATCAAGGTATCAAGCAATTAACTAAATGTCTTCCACTAGAACGCAGAACACCATTTTGCAATTATTTATTTGATGTAAACCAGTGTGTTAGATCAAAATCACTTCGACGCCGTTTTTTGACTCCGTGAAAATCTTGGTATTCTTCTCGCATTGCATAATGATGGTTTGTTGAAATAAAATTAAACGCTTAACGTTCTTAAAATGAGCGCGATACTACTTTTCTTTGTAGATTTTCTGCATGCGCTCCTTTTAAGTTGATCCCGAGCTACAAACTTCTTTATGAACGTTTTGGATTTCTCCAAAATAAAGCCTGCAAGCAGTTTTCTAAAAACACCGCACCCCCCATTAGGAATTTCTAGATCCGCCCCTGCATACAGTATTTGTTAATTATTAAAACCAACCAGCAGCAATTGTTTATTCAATGACTATTAAACCAACCTGGATAGTGCGTTTGGTCTTGATTGAAGCGATTGCTGCATTGACGTCTTTCGGAACCACATCACC
>dvex294195
GAATCAGTGGAAAAGTCACAACGCAGCTTGCCGAATTACTGCAGATTCTTTACACTTTTTTTTCTACATTATCACTGTTTTGCTTAATTTTCAATTATAGAAATCAAAATTAATAACTGGTATGTAGTTGGTCGGTGCTTCGAGAAAGTAGCCTACTCAATGATTTCTCAGAATGTTACAGTACTTCAAAAAAACAGACTACCCATTTCAAAAAATATAAACCTAGTA

Я хочу сравнить каждый ключ хеша со столбцом Hit (dvex\d++) этой таблицы:

#Query Hit  sense start end star_q end_q lenght_q # this line is informative don't make part of the code.
miRNA1 dvex28051 +  205     232     11  38  51
miRNA1 dvex202016 -  75    106  17  48  51
miRNA1 dvex294195 +  55     85     11  48  51

Если это существует, я хочу присвоить его значение хеша переменной (то есть: $sequence) для применения функции substr:my $fragment = substr $sequence, $start, $length_sequence;

Я сделал массив с последовательностями, и попытался прочитать его каждые 2 значения и сравнить его:

while (my $line1 = <$MYINPUTFILE>){ #Entry of the sequences Fasta file
chomp $line1;
push @array_lines, $line1;
}
while (my $line2 = <$IN>){ #Entry of the table
chomp $line2;
push @database_lines, $line2;
}   
foreach my $database_line (@database_lines){ #each value of the table
my @entry = split /\s++/,$database_line;
$pattern = $entry[1];
$query = $entry[0];
$start = $entry[3];
$l_pattern = length $pattern;
$end = $entry[4];
$lng_sequence = ($end - $start) + 1;
$sense = $entry[2];
$l_query = $entry[7];

my $count = 2;
for (my $i = 0; $i <= $#array_lines; $i +=$count){
    chomp $array_lines[$i-2];
    chomp $array_lines[$i-1];   
    $seq = $array_lines[$i-1];
    $header = $array_lines[$i-2];
if($new_header =~ /$pattern/ && $l_header == $l_pattern){
    if(($end+$right_diff+$increment) > $l_query){
        $clean_seq = substr $seq, $start, $l_query;
} else {;} 
}

Проблема с моим кодом в том, что Perl распознает $ seq как последнюю последовательность. И всегда применяйте функцию substr к этому $ seq. Мне нужно искать $ pattern и искать в этих последовательностях, если они существуют, назначать $ seq его последовательности, затем применять функцию substr. Некоторые предложения?

1 ответ

Решение

Я вижу две существенные проблемы с вашим кодом. Сначала в цикле:

for (my $i = 0; $i <= $#array_lines; $i +=$count){
    chomp $array_lines[$i-2];
    chomp $array_lines[$i-1];   
    $seq = $array_lines[$i-1];

$i устанавливается в ноль в первый раз, но вы получаете доступ к элементам массива $i-1 а также $i-2, Элемент -1 будет последним элементом массива, и -2 будет второй до последнего элемента. Так выглядит $seq а также $header будет иметь неправильные значения в первый раз через ваш цикл. Может быть, вам нужно начать $i в $count вместо нуля?

Во-вторых, в этой строке:

if(($end+$right_diff+$increment) > $l_query){

$increment появляется только здесь, в вашем коде. Он никогда не настроен ни на что. Вы хотели использовать $i Вот?

Несколько других предложений:

Убедись, что ты use warnings; use strict; Это будет ловить ошибки, такие как $increment переменная выше.

Вот более простой способ чтения файла в массив:

my @array_lines = <$MYINPUTFILE>;
chomp @array_lines;

В регулярных выражениях ++ это специальный квантификатор, который отключает возврат. Если вы хотите разделить один или несколько пробельных символов, более типично использовать split /\s+/или эквивалент split ' '

С помощью этой строки вы, кажется, просто проверяете, что две строки равны:

if($new_header =~ /$pattern/ && $l_header == $l_pattern)

Вы могли бы просто сделать это вместо этого:

if($new_header eq $pattern)

Когда у вас есть несколько условий, яснее поместить их все в одно if оператор вместо использования вложенных операторов. Если у вас много условий, вы можете поместить их в несколько строк для ясности.

Не нужно использовать else {;} Если вам не нужно ничего делать, просто опустите else пункт в целом.

Другие вопросы по тегам