Я пытаюсь читать два отдельных файла, используя два независимых цикла 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.
Он отлично работает на моей машине (Ubuntu 16.04, Perl 5.22). Хотя некоторые ключевые слова 'my' должны были быть добавлены сначала, чтобы отключить предупреждения. –
Я не вижу никаких ошибок - и я тестировал, и он отлично работает (v5.10). Ваш первый цикл завершен - вы пытались напечатать между петлями? Являются ли файлы cetainly ОК? Можете ли вы показать полный пример вместе с несколькими короткими примерами файлов? – zdim
Во-первых, ваше «_data extract ..._» может быть вам в бесконечном цикле либо «while», либо сразу же выйти из второго цикла. – zdim