-1

我想使用 substr 函数来恢复序列中的一些核苷酸。这里我有这些序列的 FASTA 格式:

>dvex28051
AAAACAAAAACATTCGCTAGAAAGTAATCAGCTGGTCATTTATTTGAAATGTTAATGATATATTTCATGTTGCTAATTTTTTATGAAAAAAATCATTGCTTATTTAATTACTCTTGGTTCTTGACCAACTATAAAAGCATTGTTTAGTATCAAGTGTCCAGGTATCAGCAGTTTTGTTTGAAAACAAACTTTTATTCATGCAGTCAGTGGCGGATCCAGGTAGAGTGCAGAGGCAGCACCCTCCGTCAGAAAACCAAAAAAAGAAGAAATGAAAAATTATAAAAAAAATTTCTAAACGTTGGTGCACTTAAGTGTAGCAAAAAATTCCTGTTTAGATATTCAGTGGGGAGCGACACCTTTTGGGGCCTATAGCTTCAAATCTTACTTGGTGACCTAAAATCGCTTTTTCGTTGGATCTGCGAAAGCTAGAATTTGGTTGCTGCAAATCGAATCGGTGCATCAACTGCATCAATATCAACGATGTGGTGACTGGTGGTATATTTTGGGTTCGTGCAATGCTACATTTATTTCAATCATATTTCAAGGCAGAAAGGGAAAGAAAACATCAGGTCAAGACAGTGGCGTAGCGAGGGAAGGGGGGCATACGTCCCCGGGCGCAACACGATGTCTTTTTTTTTAATCATCTGCGAAATTCAGACATTTTTTAGAGACTAAATGAAACTATGGAAAACCGGGCCCTTATAAAAGTTGAGACCAAGTGAAAAACTGGGGATAAAACATGAAAATCGGGCTCCAAAAGAATGAGAGTCCGCCCTTGGTCTGTACCAGCATGATTTGAGCGCAAATTTCATTAAGCCCCCGGGCGCAAGACACTCACGCTACGCCCCTGGGTAAAGACAAACAGAGTAGTTTTTCTTATAAACACAAGCATGCACAAACAACATAAAAACAAAACACAGTTTTTTTTAAGACGATGTGCTGCGTGCACCCGCTCAATGTTTTTTTTTTTTTTTTATAGAAAAGCAAAACTTTGAAAGGTTAACGTCAACTCATTTTACAACAATTTGTGGCAAATGGTATCAAGGTATCAAGCAATTAACTAAATGTCTTCCACTAGAACGCAGAACACCATTTTGCAATTATTTATTTGATGTAAACCAGTGTGTTAGATCAAAATCACTTCGACGCCGTTTTTTGACTCCGTGAAAATCTTGGTATTCTTCTCGCATTGCATAATGATGGTTTGTTGAAATAAAATTAAACGCTTAACGTTCTTAAAATGAGCGCGATACTACTTTTCTTTGTAGATTTTCTGCATGCGCTCCTTTTAAGTTGATCCCGAGCTACAAACTTCTTTATGAACGTTTTGGATTTCTCCAAAATAAAGCCTGCAAGCAGTTTTCTAAAAACACCGCACCCCCCATTAGGAATTTCTAGATCCGCCCCTGCATACAGTATTTGTTAATTATTAAAACCAACCAGCAGCAATTGTTTATTCAATGACTATTAAACCAACCTGGATAGTGCGTTTGGTCTTGATTGAAGCGATTGCTGCATTGACGTCTTTCGGAACCACATCACC
>dvex294195
GAATCAGTGGAAAAGTCACAACGCAGCTTGCCGAATTACTGCAGATTCTTTACACTTTTTTTTCTACATTATCACTGTTTTGCTTAATTTTCAATTATAGAAATCAAAATTAATAACTGGTATGTAGTTGGTCGGTGCTTCGAGAAAGTAGCCTACTCAATGATTTCTCAGAATGTTACAGTACTTCAAAAAAACAGACTACCCATTTCAAAAAATATAAACCTAGTA

我想将散列的每个键与该表的命中列 (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 识别为最后一个序列。并且总是在这个 $seq 上应用 substr 函数。我需要搜索 $pattern 并在这些序列中搜索,如果存在,将 $seq 分配给它的序列,然后应用 substr 函数。一些建议?

4

1 回答 1

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. Element-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语句中而不是使用嵌套语句会更清楚。如果您有许多条件,您可以将它们放在多行以清楚起见。

It is not necessary to useelse {;} 如果你不需要在那里做任何事情,只需else完全省略该子句。

于 2013-02-27T09:10:36.660 回答