读取文件(逐行)问题

时间:2011-05-17 18:57:02

标签: perl file while-loop

我要尝试使用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 

2 个答案:

答案 0 :(得分:4)

这里有几个问题:

1.强烈建议使用三参数形式的open并使用本地var而不是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退出

  3. 如果是这种情况,那么通过删除生产者仍在写日志消息的2.1处的文件,您正在创建一种生产者正在写入“悬空”文件的情况,该文件已从文件系统,但仍然在打开句柄。

    然后当您在2.2打开日志时,该文件将被重新创建为空文件,这意味着您的while循环将找不到任何行,并且您的打印不会发生。

    我建议:

    1. 在启动生产者之前启动使用者并让它等到日志文件存在以尝试打开它(使用上面的sleep命令),或者

    2. 首先启动生产者但不删除消费者中的日志文件。

答案 1 :(得分:0)

乍一看,看起来你的循环语法是正确的。你确定文件实际上是被访问的吗?尝试添加一条消息来死“文件无法打开:$!”,为$!将打印出与文件打开有关的任何错误消息。

另外,如果您还没有,请使用strict和warnings pragma。