2016-10-18 23 views
0

standalone blastnを使って2つの配列を比較したいと思います。配列perlの2つの要素を結合する

私はそれを行う前に、各断片の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

をはい、仕事のthats!ありがとうございました 。しかし、このコードは1つのファイルだけを読み込みます。次に、複数のファイルを読み込み、各ファイルの同じ処理を実行しようとします。私はそれを実行することができますが、ファイル内には最後の断片だけが表示されます。 – era

0

あなたは最後のカットを削除し、.=連結演算子を使用して最後から2番目のカットにそれを追加する必要があります。ここでは

は簡単な例です:

#!/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 
関連する問題