我有SNP数据和数据。我正在寻找的立场,SNP在将军名单的数据,当我比较的基因列表。例如:
Pos_start pos_end 14185 14185 ..。.
5“侧(Pos_start)3”无柄(Pos_end)1 1527 1920 1777 ..
的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;
}
}如果你能给我指点,我会很感激的。
发布于 2011-08-19 10:37:22
首先,排序子不对传递的值进行操作。应该有点像
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 so,$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一样简单,但我不确定空变量是否比非空字符串要小,而且指尖上没有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) = @_;即可。
而且,我在没有任何编译器帮助的情况下编写了它,所以其中可能有一些小错误。
https://stackoverflow.com/questions/7117696
复制相似问题