在循环中推送到数组

时间:2015-09-08 19:50:18

标签: arrays perl push average

我试图制作一个计算两个氨基酸质心的脚本,然后找到两个质心之间的距离。显然要做到这一点,我需要我拥有的所有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。我知道它只是在每次循环时覆盖数组,但是我希望它会将每个值添加到数组中,最后给出正确的值。

所以我要问的是,如何修复它以便我可以使用每个值获得“完整”数组?

1 个答案:

答案 0 :(得分:2)

您为每个匹配的行重新创建数组,并计算单个元素的平均值。在外面声明数组,并在完成文件后打印它们的值:

r = requests.post('http://localhost/upload.ws', files={'file': open('test_äöå.txt')}, data=param, auth=HTTPBasicAuth('user', 'pass'))