我是Perl的初学者,希望将一些文件格式的数据存储到变量中。具体来说,文件的每一行都有如下格式:
ATOM 575 CB ASP 2 72 -2.80100 -7.45000 -2.09400 C_3 4 0 -0.28000 0 0
我能够使用匹配来获得我想要的行(使用下面的代码)。
if ($line =~ /^ATOMs+d+s+(CB+)s+$residue_name+s+d+s+$residue_number/)
{
}
但是,我想将这三个坐标值存储为变量或散列。是否可以使用匹配来存储坐标值,而不必使用子字符串。
在这种情况下,我只需将每个记录split
放入一个数组中,并验证标识字段。如果已经发现线是相关的,则可以简单地从阵列中提取坐标值。
像这个
use strict;
use warnings;
my $residue_name = 'ASP';
my $residue_number = 72;
while (<DATA>) {
my @fields = split;
next unless $fields[0] eq 'ATOM'
and $fields[2] eq 'CB'
and $fields[3] eq $residue_name
and $fields[5] == $residue_number;
my @coords = @fields[6, 7, 8];
print "@coordsn";
}
__DATA__
ATOM 575 CB ASP 2 72 -2.80100 -7.45000 -2.09400 C_3 4 0 -0.28000 0 0
输出
-2.80100 -7.45000 -2.09400
您可以获得匹配$'之后的行的末尾(请参阅http://perldoc.perl.org/perlvar.html),并围绕空间拆分,如:
if ($line =~ /^ATOMs+d+s+(CB+)s+$residue_name+s+d+s+$residue_number/)
{
$_ = $';
(undef, $x, $y, $z) = split /s+/;
...
}
(undef是必要的,因为$_将以一些空格开头,因此第一个变量将为空)
你也可以写一些类似的东西:
if ($line =~ /^ATOMs+d+s+(CB+)s+$residue_name+s+d+s+$residue_number/)
{
$_ = $';
/s+(-?d+.?d*)s+(-?d+.?d*)s+(-?d+.?d*)/;
($x, $y, $z) = ($1, $2, $3);
}
事实上,在Perl中,有很多方法可以做到这一点…