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

时间:2013-07-21 21:40:07

标签: regex perl

我是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/)
{

}

但是,我想将三个坐标值存储为变量或哈希值。是否可以使用匹配来存储坐标值,而不必使用子字符串。

2 个答案:

答案 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