0

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

}

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

4

2 回答 2

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

于 2013-07-21T22:26:46.500 回答
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
于 2013-07-21T23:16:20.400 回答