如何以此格式从哈希打印键和值

时间:2014-08-04 20:11:02

标签: perl

我不确定这个叫什么,我是从实验室朋友那里得到的。我正在尝试为特定粒子的每个X,Y和Z坐标创建键和值,但是在打印我需要的东西或调用指定的坐标时遇到问题。

这是我的确切脚本:

#!/usr/bin/perl 

use strict;
use warnings;
use diagnostics;

#my $inputFile = $ARGV[0];
my $inputFile = '8ns_emb_alt_101.pdb';

open (INPUTFILE, "<", $inputFile) or die $!;

my @array = <INPUTFILE>;

#check
#print "@array \n";
######

#### CoM of MET ####
my $met_Sulfur = 'SD';
my $met_CarbonB = 'CB';
my $met_CarbonG = 'CG';
my $met_CarbonE = 'CE';
my $met_number = '34';

my $COM_MET_Coords;

for (my $line = 0; $line <= $#array; ++$line){
   if (($array[$line] =~ m/\s+$met_Sulfur\s+/)&&($array[$line] =~ m/\s+$met_number\s+/)){
#      print "$array[$line]";
      my @splitLine = (split /\s+/, $array[$line]);
      my %coordinates = (x => $splitLine[6],
                         y => $splitLine[7],
                         z => $splitLine[8],
                         );
     push @{$COM_MET_Coords->[0]}, \%coordinates;
   }
}
foreach my $line (@{$COM_MET_Coords->[0]}){
   print "$line->{'x'}\n";

我还尝试使用以下方式进行打印:

print $COM_MET_Coords->[0]->[0]->{'x'};

我的主要问题是我不完全理解我想要的信息存储方式和位置,我不确定这是什么。我使用的是perl v5.10.1。如果有人能告诉我如何打印X Y和Z以及为什么那将是完美的!

这是数据样本:

ATOM    527  N   MET   34      -9.849  -0.893  17.835  0.00  0.00      PROT  
ATOM    528  HN  MET   34      -9.231  -0.252  17.386  0.00  0.00      PROT  
ATOM    529  CA  MET   34     -10.593  -1.664  16.897  0.00  0.00      PROT  
ATOM    530  HA  MET   34     -11.657  -1.526  17.023  0.00  0.00      PROT  
ATOM    531  CB  MET   34     -10.159  -1.300  15.525  0.00  0.00      PROT  
ATOM    532  HB1 MET   34     -10.188  -2.148  14.808  0.00  0.00      PROT  
ATOM    533  HB2 MET   34      -9.082  -1.050  15.637  0.00  0.00      PROT  
ATOM    534  CG  MET   34     -10.806   0.010  15.045  0.00  0.00      PROT  
ATOM    535  HG1 MET   34     -10.226   0.384  14.174  0.00  0.00      PROT  
ATOM    536  HG2 MET   34     -10.755   0.660  15.945  0.00  0.00      PROT  
ATOM    537  SD  MET   34     -12.551  -0.153  14.748  0.00  0.00      PROT  
ATOM    538  CE  MET   34     -12.486  -0.712  13.101  0.00  0.00      PROT  

2 个答案:

答案 0 :(得分:1)

这就是我想你想做的事。

您显示的代码只是从输入文件构建3D坐标的哈希值,然后从每个条目打印x坐标。这就是我要写的东西。

由于您没有定义$COM_MET_Coords,我使用了一个简单的数组变量@coords。我还使用while逐行读取文件,因为将其全部读入数组是浪费的,然后只是逐行处理数组。

输出不是很有趣,因为您的数据中只有一行包含SD34

顺便说一下, please 不要在本地标识符中使用大写字母。数字,小写字母和下划线_都可以,但大写字母是为包等全局名称保留的。

#!/usr/bin/perl

use strict;
use warnings;
use autodie;

my ($input_file) = @ARGV;
$input_file = '8ns_emb_alt_101.pdb';

#### CoM of MET ####
my $met_sulfer   = 'SD';
my $met_carbon_b = 'CB';
my $met_carbon_g = 'CG';
my $met_carbon_e = 'CE';
my $met_number   = '34';

open my $fh, '<', $input_file;

my @coords;

while (<$fh>) {

  next unless /\s$met_sulfer\s/ and /\s$met_number\s/;

  my %coordinates;
  @coordinates{qw/ x y z /} = (split)[5, 6, 7];
  push @coords, \%coordinates;
}

for my $item (@coords) {
  print $item->{x}, "\n";
}

<强>输出

-12.551

答案 1 :(得分:0)

当您不了解perl中的数据格式时,Data :: Dumper通常是一个很好的起点。

use Data::Dumper;
# ... populate data structures
print Dumper($COM_MET_Coords);

如果您只需要数据,那么这将是解决方案的结束。如果您需要按摩数据,那么至少可以让您了解它是如何布局的。