我试图制作一个计算两个氨基酸质心的脚本,然后找到两个质心之间的距离。显然要做到这一点,我需要我拥有的所有x,y,z坐标,并且可以很好地得到。但是,当我试图找到每个的平均值时,我只是得到最后一个值。现在我有一个相当冗长的代码,但是给我带来麻烦的部分是:
for (my $line = 1; $line <= $#data; ++$line) {
if (($data[$line] =~ m/\s+$resid1\s+P/)&&($data[$line] =~ m/P\s+$resnum1\s+/)) {
chomp $data[$line];
my @splitline = (split /\s+/, $data[$line]);
#print "$splitline[1] $splitline[3] $splitline[5] $splitline[6] $splitline[7] $splitline[8]\n";
#atom# #residue #resid #x-coor #y-coor #z-coor
#calculate the average x coordinate
my @xcoordinate_array;
push @xcoordinate_array, $splitline[6];
$xsum =sum(@xcoordinate_array);
$xaverage=($xsum/$#xcoordinate_array);
print "@xcoordinate_array \n";
#calculate the average y coordinate
my @ycoordinate_array;
push @ycoordinate_array, $splitline[7];
$ysum =sum(@ycoordinate_array);
$yaverage =($xsum/$#ycoordinate_array);
#calculate the average z coordinate
my @zcoordinate_array;
push @zcoordinate_array, $splitline[8];
$zsum =sum(@zcoordinate_array);
$zaverage=($zsum/$#zcoordinate_array);
}
}
基本上应该做的是搜索一些残留名称(resid1
),然后搜索一些残留数(resnum1
),将该行读入数组(@splitline
)(其重要内容在第5行解释,然后它应该将每种类型的值放入其单独的数组中并使用子例程(sum
)来添加整个数组,然后除以事物中的数量。阵列。
但是,当我打印任何平均值时,它只是最后一个值。我理解为什么会发生这种情况,但是我无法计算循环之外的平均值,因为perl抛出一个拟合说我无法访问循环外的@xcoordinate_array
。我知道它只是在每次循环时覆盖数组,但是我希望它会将每个值添加到数组中,最后给出正确的值。
所以我要问的是,如何修复它以便我可以使用每个值获得“完整”数组?
答案 0 :(得分:2)
您为每个匹配的行重新创建数组,并计算单个元素的平均值。在外面声明数组,并在完成文件后打印它们的值:
r = requests.post('http://localhost/upload.ws', files={'file': open('test_äöå.txt')}, data=param, auth=HTTPBasicAuth('user', 'pass'))