我有SNP数据和gen列表数据。当我与gen列表比较时,我正在寻找SNP cotain在gen列表数据中的位置。例如:
SNP数据:
Pos_start pos_end
14185 14185
.... .....
gen列表数据:
5"side(pos_start) 3"sile(pos_end)
1 1527
1920 1777
.... .....
结果: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;
}
}
如果你能给出一些指示,我将不胜感激。
答案 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) = @_;
而且,我在没有任何编译器帮助的情况下编写它,因此可能会有一些小错误。