2011-08-19 50 views
1

我有SNP數據和gen列表數據。當我和gen列表比較時,我正在查找gen列表數據中的SNP cotain的位置。例如:查找gen列表中SNP的位置

  1. 的SNP數據:

    Pos_start pos_end 
    14185  14185  
    ....  ..... 
    
  2. 的根目錄數據:

    5"side(pos_start) 3"sile(pos_end) 
        1     1527  
        1920    1777 
        ....    ..... 
    
  3. 結果:在位置SNP的14185含有的16185位gen列表。

下面是我的代碼,但它在排序數字時有一些問題。

#!/usr/bin/perl -w 

    open(POS1,"<posi1.txt"); (I collect two data and save with posi1.txt) 
    @posi1=<POS1>; 
    open(list,">list.txt"); 
    @[email protected]; 
    @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

這個問題還不清楚。我無法說出SNP位置14185中包含在gen列表的(??)位置的答案。「從這個例子中,我無法理解所期望的結果。請您進一步解釋您的期望。我們不是生物信息學(至少不是每個人),所以你可能需要解釋一些明顯的事情 – J0HN

+0

在SNP的位置開始14185我不知道它包含在gen列表中或沒有,所以我尋找那個位置containd在gen list and the position at the gen。 例如:在SNP 14185的位置是T. – Phan

+0

沒有澄清任何問題,詢問正確的問題,得到正確的答案,問題現在不是'正確'。什麼是SNP?數據連接到你的樣本中的'gen'列表?什麼是基因型,參考是什麼意思?起始密碼是[起始密碼子](http://en.wikipedia。org/wiki/Start_codon),我猜想? '5'側面和'3'側面與任務有關嗎? – J0HN

回答

0

首先,您的排序子不會對您傳遞的值進行操作。它應該像

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一樣簡單,但我不確定空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 ($b,$a) = @_;

更換my ($a,$b) = @_;而且,我寫它沒有任何編譯器幫助,所以有可能在其中會有一些小錯誤。

+0

與'sort'結合使用的子程序不需要解壓'@ _'。他們可以直接使用包全局變量'$ a'和'$ b'。請參閱http://perldoc.perl.org/functions/sort.html。另外,如果OP實際需要進行數字比較,則不建議使用'<=>'的方法。 – FMc

+0

非常感謝。我對數據進行了排序。現在,我在Perl中的操作有問題。我想寫出excel的操作:= MOD((AH4-AG4),3)+1(AH4的值= 14185,AG4 = 13628)。你能告訴我如何用Perl編寫它嗎? – Phan

+0

我假設'MOD'是一個模操作符。 '我的$ a = 14185;我的$ b = 13628);我的$ rslt =(($ a- $ b)%3)+ 1'。看看[perlop](http://perldoc.perl.org/perlop.html) – J0HN