Найдите положение SNP в списке генов - PullRequest
1 голос
/ 19 августа 2011

У меня есть данные SNP и данные списка генераторов.Я ищу положение SNP cotain в данных списка генов при сравнении со списком генов.Например:

  1. Данные SNP:

    Pos_start pos_end 
    14185     14185      
    ....      .....   
    
  2. Данные списка генерации:

    5"side(pos_start)  3"sile(pos_end)
      1                  1527      
      1920               1777 
      ....               ..... 
    
  3. результат: в позиции 14185 SNP содержится в позиции 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;
}
      }

Буду признателен, если вы дадите несколько указателей.

1 Ответ

0 голосов
/ 19 августа 2011

Прежде всего, ваша подпрограмма сортировки не работает с передаваемыми вами значениями. Это должно быть что-то вроде

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+).

Чем вам не нужен <=> оператор, так как $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) = @_;

И я написал это без помощи компилятора, так что в нем могут быть незначительные ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...