0

これは、最初の2列に$positionと$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)

形式は常に「-」の後の$amino(-0188-THR)の前の4桁です。$ position入力が「1桁(CASE 1のように)」または「3桁(CASE 2、列1のように)」の場合、コードが機能しないことに突然気付きました。「-」の後に2つのゼロとTHEN位置が続く形式としてハードコーディングしたため、機能するには常に2桁の入力である必要があります。

1/2/3桁を入力できるように、このコードを一般化することに困惑しています。残りの桁は常にゼロに置き換えられます。

4

2 に答える 2

1

sprintfを使用して文字列をフォーマットできます。

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

ここで%04dは、位置の左側に0を追加して、4桁の長さにします。

于 2012-08-15T15:32:47.597 に答える
0

まず、==perlの演算子は、算術式の比較にのみ使用されます。文字列を比較するには、eq演算子を使用する必要があります
。次に、数字から文字列をフォーマットするには、sprintf関数を使用できます。

if ($f[2] eq "-".sprintf("%04d", $position)."-".$amino ...
于 2012-08-15T15:35:08.667 に答える