2011-08-19 72 views
-1

這是一個循環,數組不會被覆蓋,只會增長。數組未被覆蓋

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 
+0

如果你不想保留所有的值,爲什麼要插入數組? – Mat

+0

爲什麼你的代碼中有'sleep 1' ????? – ErikR

+0

你知道這是一個好點 - 我想使用List :: Util來添加值,然後對它們進行平均 - 使用$#array長度值是劃分總和並獲得平均值的好方法 – capser

回答

7

你需要清除陣列的每個文件:

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

在某些時候,你會希望在詞法範圍的變量(即my聲明) 但現在這個讀了應該管用。

+0

謝謝 - 是的,這工作 – capser

2

需要注意的事項,這將有助於改善這種代碼:

  • use strict; use warnings;
  • 考慮使用for my $just_ecp (@just_ecps) { ... },而不是C風格的構建
  • 定義的平均子程序(sub avg { sum(@_)/@_ }),並使用它(avg(@ecp))是一種更直觀的方式來計算平均值而不是數組長度。所有它需要一條線!
+0

是的,我需要遷移來自神祕的c構造 – capser