我不确定这个叫什么,我是从实验室朋友那里得到的。我正在尝试为特定粒子的每个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
答案 0 :(得分:1)
这就是我想你想做的事。
您显示的代码只是从输入文件构建3D坐标的哈希值,然后从每个条目打印x坐标。这就是我要写的东西。
由于您没有定义$COM_MET_Coords
,我使用了一个简单的数组变量@coords
。我还使用while
逐行读取文件,因为将其全部读入数组是浪费的,然后只是逐行处理数组。
输出不是很有趣,因为您的数据中只有一行包含SD
和34
。
顺便说一下, 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);
如果您只需要数据,那么这将是解决方案的结束。如果您需要按摩数据,那么至少可以让您了解它是如何布局的。