入力ファイルを受け取り、フォローアップコマンドに基づいて操作を実行するPerlプログラムの作成に関するヘルプを探しています。私はPerlの初心者なので、提案を進めすぎないでください。私がこれまでに持っている構造は、メインプログラムと4つのサブプログラムです。
私は2つの部分で問題を抱えています:
入力ファイル(固定幅形式)から各行に一意のレコードを作成するメインセグメントの部分を書き込みます。これはsubstrで行う必要があると思いますが、これをどのように構成するかについてはよくわかりません。開梱は、これまでの私の学習の範囲を超えています。
メインプログラムで呼び出される関数の1つは、原子間の距離を計算する「距離」サブです。これはForループ内のForループである必要があると思います。私が取るべきアプローチについて何か考えはありますか?
レコードには、アトムレコードの配列(改行ごとに1つのレコード/アトム)を格納する必要があります。
•原子のシリアル番号、5桁。(列7〜11)
•それが属するアミノ酸の3文字の名前(列18〜20)
•原子の3つの座標の実数(10進数および直交座標(x、y、z)(列31〜54))
Xのオングストローム列。31-38
オングストローム列のYの場合。39-46
オングストローム列のZの場合。47-54
•原子の1文字または2文字の要素名(例:C、O、N、Na)(列77-78)
sub Distance#アトムレコードの配列を取得し、その配列内のアトム
のすべてのペア間の最大距離#を返します。(列31-54)
これは、入力ファイルからのサンプルテキストです。
# truncating for testing purposes. Actual data is aprox. 100 columns
# and starts with ATOM or HETATM
__DATA__
ATOM 4743 CG GLN A 704 19.896 32.017 54.717 1.00 66.44 C
ATOM 4744 CD GLN A 704 19.589 30.757 55.525 1.00 73.28 C
ATOM 4745 OE1 GLN A 704 18.801 29.892 55.098 1.00 75.91 O
これが、makeレコードのメインとサブについてこれまでに持っているものです。私は足が不自由になるのは嫌いですが、Distance subに表示するものはまだないので、コードを与えることについて心配する必要はありません。アプローチ方法に関する提案をいただければ幸いです。
use warnings;
use strict;
my @fields;
my @recs;
while ( <DATA> ) {
chomp;
@fields = split(/\s+/);
push @recs, makeRecord(@fields);
}
for (my $i = 0; $i < @recs; $i++) {
printRec( $recs[$i] );
}
my %command_table = (
freq => \&freq,
length => \&length,
density => \&density,
help => \&help,
quit => \&quit
);
print "Enter a command: ";
while ( <STDIN> ) {
chomp;
my @line = split( /\s+/);
my $command = shift @line;
if ($command !~ /^freq$|^density$|length|^help$|^quit$/ ) {
print "Command must be: freq, length, density or quit\n";
}
else {
$command_table{$command}->();
}
print "Enter a command: ";
}
sub makeRecord
# Read the entire line and make records from the lines that contain the
# word ATOM or HETATM in the first column. Not sure how to do this:
{
my %record =
(
serialnumber => shift,
aminoacid => shift,
coordinates => shift,
element => [ @_ ]
);
return\%record;
}