2012-08-15 24 views
0

這是一個程序,它抓取前兩列中包含$ position AND $ amino值的行。操作數字

代碼:

#!/usr/bin/perl 

my $id = $ARGV[0]; 
my $position = $ARGV[1]; # POSITION OF THE RESIDUE 
my $amino= $ARGV[2]; #THREE LETTER AMINO ACID CODE IN CAPITALS 
my @grabbed; 

open (FILE, $id.$amino.$position.".hb2"); 

#CREATES AN ARRAY WITH ONLY THE VALUES FROM THE HB2 FILE. REMOVES THE HEADER OF THE FILE. 

while (<FILE>) { 
    if (/^-/) { 
      push @grabbed, $_; 
      while (<FILE>) { 
      last if /^$/; 
      push @grabbed, $_; 
      } 

    } 
} 
close (FILE); 


for (@grabbed) { 
my @f = split; 
if (($f[2] == "-"."00".$position."-".$amino) or ($f[0] == "-"."00".$position."-".$amino)) { 
    push @line, $id.$amino.$position, " ",$_; 
} 
} 
print @line; 

部分輸入數據:

-0007-ARG NH2 -0009-GLN OE1 3.24 SS 2 6.00 143.3 2.38 105.9 95.8  1 #CASE 1 
-0008-GLU N -0008-GLU OE1 2.62 MS 0 -1.00 120.8 1.96 102.3 103.4  2 
-0011-ILE N -0117-ARG O 2.87 MM 106 4.90 144.0 2.00 127.5 139.0  3 
-0117-ARG N -0011-ILE O 2.75 MM 106 4.90 160.4 1.79 153.2 148.6  4 #CASE 2 
-0016-SER N -0012-THR O 2.89 MM 4 6.00 156.2 1.95 149.8 154.8  5 #CASE 3 
-0017-ALA N -0013-LEU O 3.10 MM 4 6.24 152.8 2.17 143.4 149.7  6 
-0018-GLU N -0014-ARG O 3.04 MM 4 6.24 154.1 2.11 147.2 154.2  7 
-0019-ILE N -0015-GLY O 2.90 MM 4 6.16 155.8 1.96 150.7 156.2  8 
-0016-SER OG -0188-THR OG1 2.72 SS 172 5.92 172.0 1.73 98.9 99.6  9 
-0188-THR OG1 -0016-SER OG 2.72 SS 172 5.92 163.7 1.75 116.4 115.1 10 

問題:

爲了概括我提出的匹配作爲程序:

($f[2] == "-"."00".$position."-".$amino) or ($f[0] == "-"."00".$position."-".$amino) 

的格式是alw在$氨基(-0188-THR)之前的「 - 」之後有四個數字。我突然意識到,如果$ position輸入是「一位數字(如CASE 1)」或「三位數字(如CASE 2,第1列)」,我的代碼將不起作用。由於我硬編碼格式爲「 - 」,然後是兩個零和THEN位置,它必須始終是兩位數輸入工作。

我難以概括此代碼,以便我可以放入1/2/3數字。其餘的數字總是被零代替。

+1

''==是數值相等性檢查,'=〜'是一個正則表達式的匹配。上述代碼在任何情況下都不能正常工作。 – 2012-08-15 15:35:34

回答

0

首先,僅用於比較算術==運營商在Perl表達式 比較字符串,你應該使用eq運營商
其次,格式字符串從數字就可以使用sprintf函數。

if ($f[2] eq "-".sprintf("%04d", $position)."-".$amino ... 
1

您可以格式化使用sprintf字符串:

my $mstring = sprintf("-%04d-%s", $position, $amino); 
    if (($f[2] eq $mstring) or ($f[0] eq $mstring)) { 
    # ... 
    } 

這裏,%04d增加0對位置的左側,使其4位數字。

+1

使用'eq'比較字符串; '=='如果是數字,那麼將不起作用;) – pavel 2012-08-15 15:34:22

+1

謝謝!其實(不知道爲什麼),我用eq,它沒有工作,但當我再次將它替換回==時,它確實。 – user1504209 2012-08-15 15:49:08