在gen列表中找到SNP的位置

时间:2011-08-19 06:22:11

标签: perl sequence bioinformatics dna-sequence bioperl

我有SNP数据和gen列表数据。当我与gen列表比较时,我正在寻找SNP cotain在gen列表数据中的位置。例如:

  1. SNP数据:

    Pos_start pos_end 
    14185     14185      
    ....      .....   
    
  2. gen列表数据:

    5"side(pos_start)  3"sile(pos_end)
      1                  1527      
      1920               1777 
      ....               ..... 
    
  3. 结果:SNP的位置14185包含在gen列表的16185位置。

  4. 以下是我的代码,但在排序数量方面存在一些问题。

       #!/usr/bin/perl -w
    
       open(POS1,"<posi1.txt"); (I collect two data and save with posi1.txt) 
        @posi1=<POS1>;
       open(list,">list.txt");
       @list1=@posi1;
       @list2= sort num_last (@list1);
       $list2 = join( '', @list2);
    
       print $list2;
       print list $list2."\n\n";
       close(list);
      sub num_last {
    my ($num_a, $num_b);
    $num_a=$a=~ /^[0-9]/;
    $num_b=$b=~ /^[0-9]/;
    if ($num_a && $num_b){
        return $a<=>$b;
    } elsif ($num_a){
        return 1;
    } elsif ($num_b){
        return -1;
    } else {
        return $a cmp $b;
    }
          }
    

    如果你能给出一些指示,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

首先,您的sort子对您传递的值不起作用。它应该像

sub num_last {
    my ($num_a, $num_b);
    my ($a,$b) = @_;
    ....
}

然而,如果字符串从数字开始,那么您实际上只能获得字符串中的第一个数字。为了以防万一,最好添加跳过所有前导空格。

($num_a) = $a =~ /^\s*(\d+)/;
($num_b) = $b =~ /^\s*(\d+)/;

\d+相当于[0-9]+,但两个字符更短:)。大括号强制list context$num_a$num_b会收到第一个匹配组的内容:(\d+)

然而,您不需要<=> opertor,因为$num_a$num_b应该是字符串,因此您可以将条件简化为:

if (!$num_a)
    return -1;
if (!$num_b)   
    return 1;
return $a cmp $b;

不确定,但它可能就像return $a cmp $b一样简单,但我不确定空var是否比非空字符串更小而且指尖没有perl。所以,最终的num_last函数:

sub num_last{
    my ($num_a, $num_b);
    my ($a,$b) = @_;

    ($num_a) = $a =~ /^\s*(\d+)/;
    ($num_b) = $b =~ /^\s*(\d+)/;

    if (!$num_a)
        return -1;
    if (!$num_b)   
        return 1;
    return $a cmp $b;
}

如果您需要反向排序,只需将my ($a,$b) = @_;替换为my ($b,$a) = @_;

即可

而且,我在没有任何编译器帮助的情况下编写它,因此可能会有一些小错误。