Скрипт Perl застревает в терминале без видимой причины

У меня есть сценарий Perl, который читает три файла и записывает новые файлы после прочтения каждого из них. Все это одна нить.

В этом сценарии я открываю и работаю с тремя текстовыми файлами и сохраняю содержимое в хэше. Файлы большие (около 3 МБ).

Я использую цикл, чтобы пройти через каждый из файлов (открыть -> прочитать -> выполнить некоторые действия (хэш-таблица) -> закрыть)

Я замечаю, что всякий раз, когда я сканирую первый файл, окно терминала Perl в моей оболочке Cygwin застревает. В тот момент, когда я нажимаю клавишу ввода, я вижу, как скрипт обрабатывает остальные файлы без каких-либо проблем.

Это очень странно, поскольку в моем сценарии нет чтения из STDIN. Более того, одна и та же логика применяется ко всем трем файлам, поскольку все находятся в одном цикле.

Кто-нибудь здесь сталкивался с подобной проблемой? Обычно это происходит при работе с большими файлами или большими хешами?

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

Если эта проблема не исчезнет, ​​как я могу ее обойти? Как обеспечить ввод ввода, когда скрипт выполняется? Что еще более важно, как я могу отладить такую ​​проблему?

sub read_set
{
@lines_in_set = ();
push @lines_in_set , $_[0];
while (<INPUT_FILE>) 
    {   $line = $_;
          chomp($line);
          if ($line=~ /ENDNEWTYPE/i or $line =~ /ENDSYNTYPE/ or eof())
          {
          push @lines_in_set , $line;
          last;
          }
          else 
          {
          push @lines_in_set , $line;       
          }
    }
    return @lines_in_set;
}

--------> Я думаю, что нашел проблему:- или вызов eof() гарантировал, что скрипт застрянет!! Как-то происходит только в первый раз. Я понятия не имею, почему, хотя

1 ответ

Решение

eof() вызов это проблема. Увидеть perldoc -f eof,

eof с пустыми скобками относится к псевдо-файлу, доступ к которому осуществляется через while (<>), который состоит из всех файлов, названных в @ARGV или STDIN если их нет

И в частности:

Обратите внимание, что эта функция на самом деле читает символ, а затем "отменяет его", поэтому не используется в интерактивном контексте.

Но ваш цикл читает из другого дескриптора, который называется INPUT_FILE,

Было бы больше смысла звонить eof(INPUT_FILE), Но даже это, вероятно, не является необходимым; ваш внешний цикл завершится, когда он достигнет конца INPUT_FILE,

Еще несколько предложений, не связанных с симптомами, которые вы видите:

добавлять

use strict;
use warnings;

в верхней части вашего скрипта и исправьте все сообщения об ошибках, которые это выдает (perl -cw script-name делает проверку только для компиляции). Вам нужно будет объявить свои переменные, используя my (perldoc -f my). И использовать последовательные отступы; Я рекомендую тот же стиль, который вы найдете в большинстве документов Perl.

Другие вопросы по тегам