1

我有 SNP 数据和基因列表数据。当我与 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 位置。

下面是我的代码,但在对数字进行排序时存在一些问题。

   #!/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;
}
      }

如果您能提供一些指示,我将不胜感激。

4

1 回答 1

0

首先,您的排序子不会对您传递的值进行操作。它应该是这样的

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

比,如果字符串从 digit 开始,您实际上只会得到字符串中的第一个数字。最好添加跳过所有前导空格,以防万一。

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

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

比,你不需要操作符,<=>因为应该是字符串,所以你可以将你的条件简化为:$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) = @_;

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

于 2011-08-19T10:37:22.230 回答