Perl 读取文件(逐行)问题

Perl 读取文件(逐行)问题,perl,file,while-loop,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\

我试图使用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);

乍一看,这个循环的语法似乎是正确的。您确定文件确实正在被访问吗?尝试添加一条消息“文件无法打开:$!”,作为$!将打印与文件打开相关的任何错误消息


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

乍一看,该循环的语法似乎是正确的。您确定文件确实正在被访问吗?尝试添加一条消息“文件无法打开:$!”,作为$!将打印与文件打开相关的任何错误消息


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

这里有几个问题:

1。
强烈建议使用open的三个arg形式,并使用本地var而不是FILEHANDLE,这会污染全局名称空间,因此不要使用

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

3.
这里有一个你想要的库

退房 及

--编辑--

根据你的评论,我猜类似的事情正在发生:

假设有两个代理人:

a producer (gnuplot) that writes to the log file 

a consumer (your script) that reads from the log file
  • 制片人开始

    1.1写入日志文件

  • 消费者开始

    2.1删除日志文件

    2.2打开日志文件进行读取

    2.3找不到要读取的行

    2.4出口

  • 如果是这种情况,则通过删除2.1中生产者仍在向其写入日志消息的文件,您正在创建生产者正在向“悬空”文件写入的情况,该文件已从文件系统中删除,但其上仍有打开的句柄

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

    我建议:

  • 在启动生产者之前启动消费者,并让其等待日志文件存在后再尝试打开它(使用上面的sleep命令),或者

  • 首先启动生产者,但不要删除使用者中的日志文件


  • 这里有几个问题:

    1。
    强烈建议使用open的三个arg形式,并使用本地var而不是FILEHANDLE,这会污染全局名称空间,因此不要使用

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

    3.
    这里有一个你想要的库

    退房 及

    --编辑--

    根据你的评论,我猜类似的事情正在发生:

    假设有两个代理人:

    a producer (gnuplot) that writes to the log file 
    
    a consumer (your script) that reads from the log file
    
  • 制片人开始

    1.1写入日志文件

  • 消费者开始

    2.1删除日志文件

    2.2打开日志文件进行读取

    2.3找不到要读取的行

    2.4出口

  • 如果是这种情况,则通过删除2.1中生产者仍在向其写入日志消息的文件,您正在创建生产者正在向“悬空”文件写入的情况,该文件已从文件系统中删除,但其上仍有打开的句柄

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

    我建议:

  • 在启动生产者之前启动消费者,并让其等待日志文件存在后再尝试打开它(使用上面的sleep命令),或者

  • 首先启动生产者,但不要删除使用者中的日志文件


  • 一般经验法则:通常会有一个Perl库所以我使用了你的open方法,我得到了无法打开的消息,但是文件就在那里……一般的经验法则是:通常有一个Perl库所以我使用了你的open方法,我得到了无法打开的消息,但是文件在那里……如果我认为你说的是,你正在运行类似shell脚本的东西,首先执行gnuplot运行,然后直接在perl脚本之后检查日志,那么我是否正确地理解了你?因此,您的问题是perl脚本在日志文件为空时过早访问日志文件?如果是这样,您可以从perl脚本运行gnuplot,从而控制进程何时完成。问题是gnuplot创建fit.log文件的速度不够快,因此我不得不等待(5);为了给gnuplot一些时间,如果我认为您所说的是运行类似于shell脚本的东西来首先执行gnuplot运行,然后直接在perl脚本之后检查日志,那么我是否理解正确?因此,您的问题是perl脚本在日志文件为空时过早访问日志文件?如果是这样,您可以从perl脚本运行gnuplot,从而控制进程何时完成。问题是gnuplot创建fit.log文件的速度不够快,因此我不得不等待(5);为了给gnuplot一些时间。
    a producer (gnuplot) that writes to the log file 
    
    a consumer (your script) that reads from the log file