数组没有被覆盖

时间:2011-08-19 05:39:57

标签: arrays perl

这是一个循环,数组不会被覆盖,它只会增长。

   for ( $j=0; $j <=$#just_ecps ; $j++){
   print "$just_ecps[$j]\n";
   for ($x=0; $x<=$#folder_dates ; $x++){
   my $archivo_histo = "/home/ha2_d11/data/ibprod/archive/$folder_dates[$x]/$just_ecps[$j]/ghistogram.gz";
      next unless (-r $archivo_histo);
      open(FILEHANDLE, "gunzip -c $archivo_histo |") or die ("could not open file $archivo_histo");
      while (<FILEHANDLE>) {
         if ($_ =~ /ave:\s+(\d+\.\d+)\s/){
           push ( @ecp_average , $1);
            sleep 1;
         }
      print "@ecp_average\n";
      }
   }

在每个实例中,最后三个值都是有效的,之前的所有值都是重复的。我需要摆脱重复,只保留最后三个值。

Eislnd1
0.00420743 0.00414601 0.0044511
Eislnd2
0.00420743 0.00414601 0.0044511 0.00303575 0.00309721 0.00302753
Eislnd3
0.00420743 0.00414601 0.0044511 0.00303575 0.00309721 0.00302753 0.0031753 0.00324729 0.00295381
Eislnd4
0.00420743 0.00414601 0.0044511 0.00303575 0.00309721 0.00302753 0.0031753 0.00324729 0.00295381 0.00324191 0.00344244 0.00311481

2 个答案:

答案 0 :(得分:7)

您需要清除每个文件的数组:

open(FILEHANDLE, "gunzip -c $archivo_histo |") or die ...
@ecp_average = ();
while (<FILEHANDLE>) {
 ...
}

在某些时候,你会想要阅读词法范围的变量(即my声明) 但是现在这应该有效。

答案 1 :(得分:2)

需要注意的事项将有助于改进此代码:

  • use strict; use warnings;
  • 考虑使用for my $just_ecp ( @just_ecps ) { ... }而不是C风格的构造
  • 定义平均子例程(sub avg { sum(@_) / @_ })并使用它(avg( @ecp ))是一种更直观的计算平均值的方法,而不是使用数组长度进行计算。一切都需要一行!