2016-10-11 2 views
1

Я пытаюсь читать два отдельных файла, используя два независимых цикла while с использованием Perl-скрипта. Я использую объектно-ориентированный способ чтения файлов (Module IO :: File). Первый цикл while для чтения file1 работает отлично, а второй, пока цикл для чтения файла2 ничего не читает. Мой код выглядит следующим образом,Второй (независимый) цикл while, не выполняющийся в Perl

#!/usr/bin/perl 
use 5.18.0; 
use warnings; 
use IO::File; 
$file1="file1.dat"; 
$file2="file2.dat"; 
my $f1 = IO::File -> new("< $file1") or die "Cannot read file1: $!"; 
my $f2 = IO::File -> new("< $file2") or die "Cannot read file2: $!"; 

while ($linef1 = $f1 -> getline()){ 
     data extraction from file 1 
} 
$f1 -> close; 
while ($linef2 = $f2 -> getline()){ 
    data extraction from file 2 
    } 

Я написал несколько заявлений печати внутри второй во время цикла, чтобы увидеть, если они выполняются или нет. Я обнаружил, что операторы печати не выполняются, что означает, что программа не вводит второй цикл while. Это означает, что, вероятно, что-то не так с оператором getline() второго цикла while, но я не знаю, как это исправить. Любая помощь будет оценена по достоинству. Редактировать: я пропустил некоторые объявления переменных в коде для краткости.

Edit2: Вот минимальный пример того, что я делаю.

#!/usr/bin/perl 
use 5.18.0; 
use warnings; 
use IO::File; 

my $output_filename = $ARGV[0]; 
my $file = substr($output_filename,0,-4); 
my $line; 
my $linef; 
my $foo = 0; 
my $bar = 0; 
my $fchk_filename = "hcho_fr.fchk"; 

my $fout = IO::File -> new("< $output_filename") or die "Cannot read log file: $!"; 
my $ffchk = IO::File -> new("< $fchk_filename") or die "Cannot read fchk file: $!"; 

while ($line = $fout -> getline()){ 
    if ($line =~ /Initial\sParameters/){ 
     $foo++; 
     print("Still in the first while loop.\n"); 
    } 
    } 

    print("First while loop completed.\n"); 
    $fout -> close; 

    while ($linef = $ffchk -> getline()){ 
    print("Entered the second while loop.\n"); 
    if ($linef =~ /Cartesian Gradient/){ 
    $bar++; 
    print("Still in the second while loop.\n"); 
    } 
    } 

    print("Successfully executed.\n"); 

Этот код работает без ошибок и дает мне следующий результат.

Still in the first while loop. 
    Still in the first while loop. 
    First while loop completed. 
    Successfully executed. 
+0

Он отлично работает на моей машине (Ubuntu 16.04, Perl 5.22). Хотя некоторые ключевые слова 'my' должны были быть добавлены сначала, чтобы отключить предупреждения. –

+0

Я не вижу никаких ошибок - и я тестировал, и он отлично работает (v5.10). Ваш первый цикл завершен - вы пытались напечатать между петлями? Являются ли файлы cetainly ОК? Можете ли вы показать полный пример вместе с несколькими короткими примерами файлов? – zdim

+0

Во-первых, ваше «_data extract ..._» может быть вам в бесконечном цикле либо «while», либо сразу же выйти из второго цикла. – zdim

ответ

-1

Вот несколько мыслей:

Скорее всего - это второй файл начинается с пустой строкой? Возможно ли, что вы получаете пустое, но истинное значение? Возможно, лучше проверить

while (defined($linef = $ffchk -> getline())){ 
    print("Entered the second while loop.\n"); 
    if ($linef =~ /Cartesian Gradient/){ 
    $bar++; 
    print("Still in the second while loop.\n"); 
    } 
} 

Только для того, чтобы убедиться, что вы получаете определенное значение обратно по сравнению с возможным пустым значением.

Что произойдет, если вы прочтете другой файл? или тот же файл, что и первый цикл? убедитесь, что это не что-то простое, как отсутствие новой строки.

И, наконец, вы пытались добавить «$ | = 1» к вашему коду, чтобы убедиться, что выход не буферизуется где-то? Это длинный снимок, но иногда вывод может выглядеть так, как будто он не отображается, потому что он сидит в буфере, ожидая, что его покраснет, пока он не появится. Я сомневаюсь, что это происходит здесь, но это хороший способ сделать абсолютно уверенным.

Это лишь некоторые случайные мысли, основанные на том, что вы описываете.

+0

Пустое поле ('' \ n "') истинно. Единственный раз, когда 'defined' будет помогать, если весь файл состоит из одного байта' 0' (за ним не следует новая строка). – ikegami

+0

Они читаются из файла, а не из трубы, поэтому нет программы для размещения '$ | = 1; '. – ikegami

Смежные вопросы