我如何从文件中读取行到Perl中的散列

时间:2016-04-11 18:43:38

标签: regex perl parsing

我使用的文件格式包含如下信息:

ATOM 1 N LYS A 56 20.508 14.774 -7.432 1.00 50.83 N

我想要的只是第一个数字,以及上例中“56”后的三个数字;所以我使用正则表达式来获取该信息。我如何将该信息放入哈希值?

到目前为止,我有:

my $pdb_file = $ARGV[0];
open (PDBFILE, "<$pdb_file") or die ("$pdb_file not found");
while (<PDBFILE>) { 
if ($_=~ /^ATOM\s+(\d+)\s+\w+\s+\w+\s+\w+\s+\d+\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)/) {
my $atom = $1;
my $xcor = $2;
my $ycor = $3;
my $zcor = $4;
print "AtomNumber: $atom\t  xyz: $xcor $ycor $zcor\n";
}
}

1 个答案:

答案 0 :(得分:4)

我建议使用split将其拆分为空白字段,而不是使用正则表达式。这将更快,更强大,它不依赖于每个字段格式的详细知识(可能会改变,就像数字有一个你忘记考虑的减号)。而且它更容易理解。

my @fields = split /\s+/, $line;

然后你可以选出字段(例如,第一个数字是字段2,所以$fields[1])并将它们放入你的哈希值。

my %coordinate = (
    atom => $fields[1],
    x    => $fields[6],
    y    => $fields[7],
    z    => $fields[8]
);

你正在读一堆线,所以你要制作一堆必须去某处的哈希。我建议将它们全部放在另一个哈希中,并使用某种独特字段作为键。可能是atom字段。

$atoms{$coordinate{atom}} = \%coordinate;