Скрипт 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.