2016-09-02 2 views
0

Я разрабатываю скрипт Perl, который должен генерировать HTML-файл из числовых значений из другого файла. Идея состоит в том, чтобы прочитать файл, который имеет эти значения, а затем перечислить их в отдельном файле HTML. Файл, содержащий числовые значения, обновляется через определенный промежуток времени, и эти изменения следует видеть в HTML.Проблема ввода-вывода файла Perl

Несмотря на то, что эти значения правильно прочитаны (я их протестировал), они не печатаются в HTML. Более того, HTML-теги даже не печатаются. Это код, который я написал:

#!/usr/bin/perl 
use IO::Handle; 
use CGI qw(:standard); 

print "Status: 200 OK", "\n"; 
print "Content-type: text/plain", "\n\n"; 

for(;;) { 
    open (my $input_file, "<", "/path/to/input/file/input_file.txt") || die "Unable to open the file: $!"; 
    open (my $html_file, ">", "/path/to/html/file/index.html") || die "Unable to open the HTML file: $!"; 
    print $html_file "<html><head><title>title</title><META HTTP-QUIV='refresh' CONTENT='10'></head><body>"; 
    @lines = <$input_file>; 
    foreach my $line (@lines) { 
     print $html_file "<p>$line</p>"; 
    } 
    print $html_file "</body></html>"; 
    sleep 1; 
    close $input_file || die; 
    close $html_file || die; 
} 

Скрипт работает только в первом для итерации. Я имею в виду, что теги HTML и числовые значения правильно печатаются в выходном файле. Затем от итерации 2 до N файл остается буквально пустым. Я не вижу, что мне здесь не хватает. Почему он работает на первой итерации, но не в следующих?

Заранее спасибо

+0

Почему вы загружаете модули CGI и IO :: Handle, но не используете их? Используются ли они в других битах программы, которые вы нам не показали? –

+0

@Dave, я использовал autoflush перед тем, как решить открыть и закрыть файл в цикле. – tulians

ответ

3

Вам нужно close файл перед темsleep. Как можно заметить, данные сбрасываются в файл по close, а затем сразу же перезаписаны следующей open и остаются пустыми в течение одной секунды

Вы также должны написать

close $html_file or die $! 

как код у вас есть эквивалентно

close($html_file || die) 

так что ваша программа никогда не умрет до тех пор, как $html_file является верно

+0

Да, вот и все. Теперь вы работаете так, как ожидалось. Большое спасибо! – tulians