Массив не перезаписывается - PullRequest
0 голосов
/ 19 августа 2011

Это цикл, и массив не перезаписывается, он просто увеличивается.

   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 ]

7 голосов
/ 19 августа 2011

Вам необходимо очистить массив для каждого файла:

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

В какой-то момент вам захочется прочитать переменные в лексической области (т. Е. Объявление my), но сейчас это должноработа.

2 голосов
/ 19 августа 2011

На что следует обратить внимание, что поможет улучшить этот код:

  • use strict; use warnings;
  • Попробуйте использовать for my $just_ecp ( @just_ecps ) { ... } вместо конструкции в стиле C
  • Определение подпрограммы усреднения (sub avg { sum(@_) / @_ }) и ее использование (avg( @ecp )) - более интуитивно понятный способ вычисления средних значений вместо перебора длины массива. Все это занимает одну строку!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...