-1

このようなファイルがあります。

Perl コードでは、配列を使用し@query = ('A+80', 'A+40', 'A+202', 'B+130', 'B+268', 'B+211', 'A+35'); ています。やりたいことは次のとおりです。配列の各要素について、以下に示すファイルの行をスキャンし、次のように出力します。

A+80 - HELIX

A+40 - SHEET

A+202 - HELIX

B+130 - HELIX

B+268 - SHEET

B+211 - SHEET

A+35 - LOOP

この出力の背後にあるロジックは、配列の各エントリについて、最初の部分 (A または B) と 2 番目の部分 (最初の部分に関連付けられた番号) を抽出することです。配列の最初のエントリを考えてみましょう: A+80. ファイルの 3 行目では、数値 80 が 78 (6 列目) と 90 (9 列目) の間にあり、最初のアルファベットAもどちらの場合も一致しています。したがって、プログラムはこのクエリに対して HELIX を出力します。

2 番目の要素を考えてみましょう: A+40. 2番目の部分、つまり数値はこの行の範囲にあります

SHEET    2   B 3 ARG A  37  VAL A  43  1

つまり、7 列目と 10 列目にリストされている数字の間で、アルファベットも一致します。したがって、このエントリの出力は次のとおりです。 SHEET

のような他の場合については、B+211. 以下の行は、それに関連付けられた数字とアルファベットに一致します。

SHEET    2   B 3 ARG A  37  VAL A  43  1

したがって、このエントリの出力は次のとおりです。 SHEET

また、アルファベットと数字が関連付けられているエントリについては、ファイル内のどの行とも一致しません。コードの出力:A+35 - LOOP

Perlでこれを行う効率的な方法は何ですか? 私は Perl の初心者なので、現在、各エントリを連続する配列要素に分割し@queryています。しかし、どういうわけか、目的の出力を得ることができません。

助けてください...

HELIX    1   1 GLY A    9  GLN A   30  1                                  
HELIX    2   2 ASP A   47  ILE A   63  1                                  
HELIX    3   3 GLU A   78  GLU A   90  1                                  
HELIX    4   4 THR A  111  ALA A  117  1                                  
HELIX    5   5 PRO A  120  LYS A  122  5                                  
HELIX    6   6 SER A  129  ARG A  137  1                                  
HELIX    7   7 CYS A  147  THR A  159  1                                  
HELIX    8   8 GLY A  178  ASN A  188  1                                  
HELIX    9   9 LEU A  202  LYS A  208  1                                  
HELIX   10  10 GLY A  224  TRP A  226  5                                  
HELIX   11  11 TYR A  258  GLU A  263  1                                  
HELIX   12  12 VAL A  275  PHE A  294  1                                  
HELIX   13  13 GLY B    9  GLN B   30  1                                  
HELIX   14  14 ASP B   47  ILE B   63  1                                  
HELIX   15  15 GLU B   78  GLU B   90  1                                  
HELIX   16  16 THR B  111  ALA B  117  1                                  
HELIX   17  17 PRO B  120  LYS B  122  5                                  
HELIX   18  18 SER B  129  ARG B  137  1                                  
HELIX   19  19 CYS B  147  THR B  159  1                                  
HELIX   20  20 GLY B  178  TRP B  187  1                                  
HELIX   21  21 LEU B  202  LYS B  208  1                                  
HELIX   22  22 GLY B  224  TRP B  226  5                                  
HELIX   23  23 TYR B  258  GLU B  263  1                                  
HELIX   24  24 GLY B  276  PHE B  294  5                                  
SHEET    1   A 2 GLU A   5  LEU A   7  0                                        
SHEET    2   A 2 PHE A 267  THR A 269  1  
SHEET    1   B 3 LYS A  66  LEU A  72  0                                        
SHEET    2   B 3 ARG A  37  VAL A  43  1  
SHEET    3   B 3 GLY A  96  VAL A  99  1  
SHEET    1   C 4 THR A 191  CYS A 195  0                                        
SHEET    2   C 4 HIS A 167  VAL A 171  1  
SHEET    3   C 4 ILE A 211  VAL A 214  1  
SHEET    4   C 4 ILE A 232  ASP A 235  1             
SHEET    1   D 2 GLU B   5  LEU B   7  0                                        
SHEET    2   D 2 PHE B 267  THR B 269  1  
SHEET    1   E 3 LYS B  66  LEU B  72  0                                        
SHEET    2   E 3 ARG B  37  VAL B  43  1  
SHEET    3   E 3 GLY B  96  VAL B  99  1  
SHEET    1   F 4 THR B 191  CYS B 195  0                                        
SHEET    2   F 4 HIS B 167  VAL B 171  1  
SHEET    3   F 4 ILE B 211  VAL B 214  1  
SHEET    4   F 4 ILE B 232  ASP B 235  1  
SHEET    1   G 2 ASN B 239  PRO B 242  0                                        
SHEET    2   G 2 ARG B 250  VAL B 253 -1
4

1 に答える 1

0

以下のプログラムは、必要なことを行うようです。DATA便宜上、ファイル ハンドルを使用してソース ファイル内からデータを読み取ります。適切なデータ ファイルを開いて読み取るように調整する必要があります。

直接アクセスできるように、ファイル全体がメモリに読み込まれます。ファイルが膨大な場合 (たとえば、数百メガバイト)、このアプローチは不適切である可能性があり、さらに支援が必要になる場合があります。

レコードの長さはさまざまであるため、アルゴリズムは、最初に見つかった 3 文字のフィールドに関連する関連フィールドを見つけます。

ハッシュ%categoriesには、必要なファイル データがすべて含まれています。Aキー文字 (またはここ) によってインデックスが付けられ、各要素の値は、各レコードがカバーする範囲の(列 1)、、およびをB含む匿名ハッシュの配列です。labelletterstartend

出力の作成は簡単で、 and を使用mapgrepて、ハッシュ内の関連するすべてのエントリの「ラベル」を見つけます。何も見つからない場合、テキスト"LOOP"はデフォルトとして追加されます。

use strict;
use warnings;

my @query = qw/ A+80 A+40 A+202 B+130 B+268 B+211 A+35 /;

my %categories;

while (<DATA>) {
  next unless /\S/;
  my @data = split;
  my @indices = grep $data[$_] =~ /^[A-Z]{3}$/, 0 .. $#data;
  my %info;
  @info{qw/ label letter start end /} = @data[ 0, $indices[0]+1, $indices[0]+2, $indices[1]+2 ];
  push @{ $categories{$info{letter}} }, \%info;
}

for my $item (@query) {
  my ($letter, $value) = split /\+/, $item;
  my @matches = map $_->{label},
      grep { $value >= $_->{start} and $value <= $_->{end} }
      @{ $categories{$letter} };
  @matches = ('LOOP') unless @matches;
  warn qq(Multiple categories for query "$item") unless @matches == 1;
  printf "%s - %s\n", $item, $_ for @matches 
}

__DATA__
HELIX    1   1 GLY A    9  GLN A   30  1                                  
HELIX    2   2 ASP A   47  ILE A   63  1                                  
HELIX    3   3 GLU A   78  GLU A   90  1                                  
HELIX    4   4 THR A  111  ALA A  117  1                                  
HELIX    5   5 PRO A  120  LYS A  122  5                                  
HELIX    6   6 SER A  129  ARG A  137  1                                  
HELIX    7   7 CYS A  147  THR A  159  1                                  
HELIX    8   8 GLY A  178  ASN A  188  1                                  
HELIX    9   9 LEU A  202  LYS A  208  1                                  
HELIX   10  10 GLY A  224  TRP A  226  5                                  
HELIX   11  11 TYR A  258  GLU A  263  1                                  
HELIX   12  12 VAL A  275  PHE A  294  1                                  
HELIX   13  13 GLY B    9  GLN B   30  1                                  
HELIX   14  14 ASP B   47  ILE B   63  1                                  
HELIX   15  15 GLU B   78  GLU B   90  1                                  
HELIX   16  16 THR B  111  ALA B  117  1                                  
HELIX   17  17 PRO B  120  LYS B  122  5                                  
HELIX   18  18 SER B  129  ARG B  137  1                                  
HELIX   19  19 CYS B  147  THR B  159  1                                  
HELIX   20  20 GLY B  178  TRP B  187  1                                  
HELIX   21  21 LEU B  202  LYS B  208  1                                  
HELIX   22  22 GLY B  224  TRP B  226  5                                  
HELIX   23  23 TYR B  258  GLU B  263  1                                  
HELIX   24  24 GLY B  276  PHE B  294  5                                  
SHEET    1   A 2 GLU A   5  LEU A   7  0                                        
SHEET    2   A 2 PHE A 267  THR A 269  1  
SHEET    1   B 3 LYS A  66  LEU A  72  0                                        
SHEET    2   B 3 ARG A  37  VAL A  43  1  
SHEET    3   B 3 GLY A  96  VAL A  99  1  
SHEET    1   C 4 THR A 191  CYS A 195  0                                        
SHEET    2   C 4 HIS A 167  VAL A 171  1  
SHEET    3   C 4 ILE A 211  VAL A 214  1  
SHEET    4   C 4 ILE A 232  ASP A 235  1             
SHEET    1   D 2 GLU B   5  LEU B   7  0                                        
SHEET    2   D 2 PHE B 267  THR B 269  1  
SHEET    1   E 3 LYS B  66  LEU B  72  0                                        
SHEET    2   E 3 ARG B  37  VAL B  43  1  
SHEET    3   E 3 GLY B  96  VAL B  99  1  
SHEET    1   F 4 THR B 191  CYS B 195  0                                        
SHEET    2   F 4 HIS B 167  VAL B 171  1  
SHEET    3   F 4 ILE B 211  VAL B 214  1  
SHEET    4   F 4 ILE B 232  ASP B 235  1  
SHEET    1   G 2 ASN B 239  PRO B 242  0                                        
SHEET    2   G 2 ARG B 250  VAL B 253 -1

出力

A+80 - HELIX
A+40 - SHEET
A+202 - HELIX
B+130 - HELIX
B+268 - SHEET
B+211 - SHEET
A+35 - LOOP
于 2012-04-22T12:05:49.257 に答える