2016-10-18 2 views
0

Я хочу сравнить две последовательности, используя standalone blastn.объединить два элемента в массиве perl

Но прежде чем я смогу сделать это, я должен вырезать последовательность на 1020nt каждого фрагмента. Если последний фрагмент меньше 1020nt, я должен объединить (последовательность) в последнем фрагменте с последовательностью в предыдущем фрагменте. Например, я вырезал последовательность на 1020nt и получаю 7 фрагментов. Но 7-й фрагмент меньше 1020nt, поэтому я должен объединить его в 6-й фрагмент. Кто-нибудь знает, как это сделать с помощью Perl language?

Это мой код:

while(<QR>){ 

    chomp; 
    s/>//g; 

    my ($scaf,$seq)= split /\n/,$_,2; 
    my $scaf_name = (split /\s+/,$scaf)[0]; 
    $seq =~ s/\s+//g; 
    my @cut = ($seq =~ /(.{1,$chop_len})/g); 

    if (length($#cut) < 1020) { 
     $#cut="@cut[-2 .. -1]"; # i get error here 
    } 
    else { 
    } 

    print $#cut; 
    for my $cut_num (0..$#cut){ 
     my $sgmID = "$scaf_name\_$cut_num"; 
     print CR ">$sgmID\n$cut[$cut_num]\n"; 
    } 
} 

close QR; 
close CR; 

На самом деле я нашел этот сценарий Perl в Интернете, и изменить его так, что я слил последние два фрагмента.

ответ

0

выпуск с

if (length($#cut) < 1020) { 
    $#cut="@cut[-2 .. -1]"; # i get error here 
} 

является то, что он пытается присвоить строку $#cut. $#cut - последний индекс @cut, поэтому он ожидает целочисленное значение.

Что-то, как это должно работать:

if (length($#cut) < 1020) { 
    $cut[$#cut-1] = join '', @cut[-2 .. -1]; 
    $#cut -= 1; # Remove last element from @cut 
} 
+0

да, вот работа! Спасибо . Но этот код читает только один файл. Затем я пытаюсь прочитать несколько файлов и выполнить один и тот же процесс для каждого файла. Я могу запустить его, но в файле просто покажутся последние фрагменты. – era

0

Вы должны удалить последние вырезать и добавить его к второму к последнему разрезу с помощью оператора .= конкатенации:

Вот упрощенный пример:

#!/usr/bin/env perl 

use warnings; 
use strict; 

my $total_length = 100; 
my $chop_length = 14; 
my @letters = qw(A C G T); 

my $long_string = join '', map { $letters[ int rand scalar @letters ] } (1 .. $total_length); 
print "Long string ($total_length chars) :\n$long_string\n"; 
print '-'x$total_length . "\n"; 
my @cut = ($long_string =~ /(.{1,$chop_length})/g); 

my $last_cut = pop @cut; # Take last one off 
if (length $last_cut < $chop_length) { 
    $cut[$#cut] .= $last_cut; # Concatenate it to the (now) last one 
} else { 
    push @cut, $last_cut; # Put it back, it has the right length 
} 

print "Parts cut into >= $chop_length char length pieces.\n"; 
for my $part (@cut) { 
    print $part . "\n"; 
} 

Выхода

Long string (100 chars) : 
CCATCCTGCACATTCGGTGATTTATCAGAAGTAAGATCCTCGTCCCACTGACCGTGCGGGGATACGGAGCTCAAACAGAGAGAAACGGTTGGTCTGTAGA 
---------------------------------------------------------------------------------------------------- 
Parts cut into >= 14 char length pieces. 
CCATCCTGCACATT 
CGGTGATTTATCAG 
AAGTAAGATCCTCG 
TCCCACTGACCGTG 
CGGGGATACGGAGC 
TCAAACAGAGAGAA 
ACGGTTGGTCTGTAGA 
Смежные вопросы