2011-05-17 110 views
0

我想要使用gnuplot自動化數據分析程序,本質上我正在做的是在gnuplot中運行曲線擬合程序,然後讀取日誌文件以取出所需的值進一步分析。閱讀文件(逐行)問題

下面是一段代碼:

#Open curvefit log file to gather the needed coefficients 
open (FILE_CURVE, 'fit.log') or die; 
while (<FILE_CURVE>) 
{ 
    push(@log, $_); 
    print "Im here\n"; 
} 
close (FILE_CURVE); 

我的問題是它沒有進入while循環,因爲我沒有看到print "Im here\n";行代碼。

同樣在程序的開始,我刪除了日誌文件,使其不會跑開。曲線擬合程序重新創建它。

這是日誌文件的樣子。 注意:在文件的開頭處有兩個空行。

******************************************************************************* 
Tue May 17 11:28:59 2011 


FIT: data read from 'temp_norm.txt' using 1:2 
     #datapoints = 2000 
     residuals are weighted equally (unit weight) 

function used for fitting: g(x) 
fitted parameters initialized with current variable values 



Iteration 0 
WSSR  : 566.797   delta(WSSR)/WSSR : 0 
delta(WSSR) : 0     limit for stopping : 1e-05 
lambda : 1.49986 

initial set of free parameter values 

cc    = 100 
dd    = 9.3 

After 31 iterations the fit converged. 
final sum of squares of residuals : 24.1325 
rel. change during last iteration : 0 

degrees of freedom (FIT_NDF)      : 1998 
rms of residuals  (FIT_STDFIT) = sqrt(WSSR/ndf) : 0.109901 
variance of residuals (reduced chisquare) = WSSR/ndf : 0.0120783 

Final set of parameters   Asymptotic Standard Error 
=======================   ========================== 

cc    = 108.497   +/- 3.189  (2.939%) 
dd    = 8.8375   +/- 0.0001571 (0.001777%) 


correlation matrix of the fit parameters: 

       cc  dd  
cc    1.000 
dd    0.246 1.000 
+0

如果我認爲你的意思是你正在運行類似於shell腳本的東西來首先執行gnuplot運行,並且直接在perl腳本之後檢查日誌,我能理解嗎?所以你的問題是,當文件爲空時,perl腳本過早訪問你的日誌文件? – TLP 2011-05-17 22:11:48

+0

如果是這樣,您可以從perl腳本運行gnuplot,從而控制進程何時完成。 – TLP 2011-05-17 22:21:16

+0

原來問題在於gnuplot沒有足夠快地創建fit.log文件,所以我不得不等待(5);爲了給gnuplot一些時間。 – Lpaulson 2011-05-19 04:22:17

回答

4

這裏有幾個問題:

1.強烈建議使用開放三arg格式,並使用一個局部變量,而不是FILEHANDLE,這會污染你的全局命名空間,所以不是

open (FILE_CURVE, 'fit.log') or die; 

使用

open(my $fh, '<', 'fit.log') or die; 
while(<$fh>){ 
} 
close($fh); 

2.刪除文件,同時它有一個開放的文件句柄不「真」將其刪除,如果您從「已刪除」文件的文件句柄中讀取,則只需從舊文件讀取。如果文件的所有鏈接都被刪除,包括打開的文件句柄,則文件會被真正刪除,這可能需要一些時間。你可能會考慮的一個策略是:

sleep 1 while ! -f $path_to_logfile; # sleep until the file exists 

3.有你想要的東西一個lib。

退房File::TailFilesys::Notify::Simple

- 編輯 -

根據您的意見,我猜是這樣發生:

假設兩個代理:

a producer (gnuplot) that writes to the log file 

a consumer (your script) that reads from the log file 
  1. 生產者開始

    1.1寫入日誌文件

  2. 消費者開始

    2。1刪除日誌文件

    2.2打開日誌文件讀

    2.3認定無線讀取

    2.4退出

如果是這種情況,則通過刪除該文件在2.1生產者仍然在寫日誌消息,你正在創造一種情況,生產者正在寫一個'懸掛'文件,一個已經從文件系統中刪除,但仍然在打開的句柄上。

然後,當您在2.2打開日誌時,文件將被重新創建爲一個空文件,這意味着您的while循環將找不到任何行並且您的打印不會發生。

我建議之一:啓動生產,並讓它等到日誌文件存在嘗試打開它(使用上面的睡眠命令)之前

  1. 啓動消費,或

  2. 首先啓動生產者,但不要刪除使用者中的日誌文件。

+1

一般經驗法則:通常有一個Perl庫。 ;-) – 2011-05-17 19:11:49

+0

所以我用你的開放的方法,即時通訊無法打開消息,但文件在那裏... – Lpaulson 2011-05-17 20:46:25

0

乍一看,它看起來像你的循環語法是正確的。你確定該文件實際上被訪問?嘗試添加一條消息到「文件無法打開:$!」,作爲$!!將打印出與文件打開相關的任何錯誤消息。

另外,如果您還沒有使用嚴格和警告編譯指示。