我是Perl的初学者,希望将文件格式的一些数据存储到变量中。具体来说,文件的每一行都有如下格式:
ATOM 575 CB ASP 2 72 -2.80100 -7.45000 -2.09400 C_3 4 0 -0.28000 0 0
我能够使用匹配来获得我想要的行(使用下面的代码)。
if ($line =~ /^ATOM\s+\d+\s+(CB+)\s+$residue_name+\s+\d+\s+$residue_number/)
{
}
但是,我想将三个坐标值存储为变量或哈希值。是否可以使用匹配来存储坐标值,而不必使用子字符串。
答案 0 :(得分:0)
你可以得到与$'匹配后的那一行的结尾(见http://perldoc.perl.org/perlvar.html),并在以下空格中分开:
if ($line =~ /^ATOM\s+\d+\s+(CB+)\s+$residue_name+\s+\d+\s+$residue_number/)
{
$_ = $';
(undef, $x, $y, $z) = split /\s+/;
...
}
(undef是必要的,因为$ _将从一些空格开始,因此第一个变量将为空)
您还可以编写如下内容:
if ($line =~ /^ATOM\s+\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一样,有很多方法可以做到这一点......
答案 1 :(得分:0)
在这种情况下,我只需将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 "@coords\n";
}
__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