在数组perl中组合两个元素

时间:2016-10-18 06:45:59

标签: perl bioinformatics

我想使用Perl language?比较两个序列。

但在我能做到这一点之前,我必须将序列切割成每个片段的1020nt。如果最后一个片段小于1020nt,我必须将最后一个片段中的(序列)与前一个片段中的序列合并。例如,我将序列切割成1020nt并得到7个片段。但是第7个片段小于1020nt,所以我必须将它合并到第6个片段中。有人知道如何使用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;

执行此操作

这是我的代码:

test.php

实际上我在互联网上找到了这个Perl脚本,并对其进行了修改,以便我可以合并最后两个片段。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
}