通过Perl中的匹配将数值数据存储在变量中



我是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中,有很多方法可以做到这一点…

最新更新