Могу ли я искать между ключами хэша и присваивать его значение переменной в 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
пункт в целом.