Проблемы с чтением файла (строка за строкой) - PullRequest
0 голосов
/ 17 мая 2011

Я пытаюсь автоматизировать программу анализа данных с помощью 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 ]

4 голосов
/ 17 мая 2011

Несколько проблем здесь:

1. Настоятельно рекомендуется использовать трех-аргументную форму open и использовать локальную переменную вместо FILEHANDLE, которая будет загрязнять ваше глобальное пространство имен, поэтому вместо

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

use

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

2. Удаление файла с открытым дескриптором файла не «действительно» удаляет его, и если вы читаете из дескриптора файла «удалено»msgstr "файл, вы просто будете читать из старого файла.Файлы действительно удаляются, когда удаляются все ссылки на них, включая открытые файловые дескрипторы, что может занять некоторое время.Вы можете рассмотреть одну стратегию:

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

3. Существует библиотека для того, что вы хотите.

Извлечение File :: Tail и Filesys :: Notify :: Simple

- EDIT -

На основев ваших комментариях я бы предположил, что происходит что-то подобное:

Предполагается, что два агента:

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. запустите потребителя, прежде чем запускать производителя, и подождите, пока файл журнала не будет создан, чтобы попытаться открыть его (с помощью приведенной выше команды sleep), или

  2. сначала запустите производителя, но не удаляйте файл журнала в приемнике.

0 голосов
/ 17 мая 2011

На первый взгляд похоже, что ваш синтаксис для этого цикла правильный. Вы уверены, что файл действительно доступен? Попробуйте добавить сообщение в файл "файл не может быть открыт: $!", Как $! распечатает все сообщения об ошибках, связанных с открытием файла.

Кроме того, если вы этого еще не сделали, воспользуйтесь прагмами строгого и предупреждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...