1

SNP データと遺伝子リスト データがあります。gen list と比較するとき、gen list データの中で SNP cotain の位置を探しています。例えば:

  1. SNP データ :

    Pos_start pos_end 
    14185     14185      
    ....      .....   
    
  2. 遺伝子リストデータ:

    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]+、2文字短くなります:)。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 に答える