【发布时间】:2011-05-21 09:08:31
【问题描述】:
寻求有关编写 Perl 程序的帮助,该程序接受输入文件并根据后续命令执行操作。我是 Perl 的初学者,所以请不要太提前提出建议。到目前为止,我的结构是一个主程序和 4 个子程序。
我在两个部分遇到了问题:
编写主段的一部分,为输入文件中的每一行创建唯一记录(这是固定宽度格式)。我认为这应该用 substr 来完成,但我不知道应该如何构建它。到目前为止,Unpack 超出了我的学习范围。
主程序中调用的函数之一是“距离”子程序,它将计算原子之间的距离。我认为这应该是 For 循环内的 For 循环。关于我应该采取什么方法有什么想法吗?
记录应该存储一组原子记录(每个换行一个记录/原子):
• 原子的序列号,5 位数字。 (第 7 - 11 列)
• 所属氨基酸的三个字母名称(第 18 - 20 列)
• 原子的三个坐标实数作为十进制和正交坐标 (x,y,z) (cols 31 - 54)
对于 X,以埃为单位。 31-38
对于以埃为单位的 Y。 39-46
以埃为单位的 Z。 47-54
• 原子的一个或两个字母的元素名称(例如 C、O、N、Na)(第 77-78 列)
子距离
# 获取原子记录数组并返回最大距离
# 在该数组中的所有原子对之间。 (第 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;
}
【问题讨论】:
-
当您使用调度表时,为什么
unpack超出了您的学习范围? -
@Zaid 我的课刚学了函数,还没有学过Unpack。
-
使用
unpack的一个警告是您必须正确使用模板。您将获得必须阅读的每个字段的开始列和结束列。@代码跳转到所需的起始位置,除了它是从零开始的,所以要跳转到第 7 列,例如可以使用@6,然后跳转到第 18 列,可以使用@17。这样您就不必计算您跳过的空格。 -
unpack的手册页位于 perldoc.perl.org/functions/unpack.html。 -
@Narveson 谢谢。 Unpack 看起来很简单。尽管如此,我的教授要求我们等到下学期再开始学习。
标签: arrays perl function hash bioinformatics