寻求有关编写 Perl 程序的帮助,该程序接受输入文件并根据后续命令执行操作。我是 Perl 的初学者,所以请不要太提前提出建议。到目前为止,我的结构是一个主程序和 4 个子程序。
我在两个部分遇到问题:
编写主段的一部分,为输入文件中的每一行创建一个唯一记录(它是固定宽度格式)。我认为这应该用 substr 来完成,但我不知道应该如何构建它。到目前为止,Unpack 超出了我的学习范围。
主程序中调用的函数之一是“距离”子程序,它将计算原子之间的距离。我认为这应该是 For 循环内的 For 循环。关于我应该采取什么方法的任何想法?
记录应该存储一组原子记录(每个换行一个记录/原子):
• 原子的序列号,5 位数字。(第 7 - 11 列)
• 其所属氨基酸的三个字母名称(第 18 - 20 列)
• 原子的三个坐标实数作为十进制和正交坐标 (x,y,z) (cols 31 - 54 )
对于 X,单位为埃 cols。31-38 代表
Y,单位为 Angstroms cols。39-46
For Z in Angstroms cols。47-54
• 原子的一个或两个字母的元素名称(例如 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
到目前为止,这是我制作记录的主要和次要内容。我讨厌跛脚,但我没有任何东西可以显示距离子,所以不要担心提供代码,任何关于如何接近的建议将不胜感激。
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;
}