Приведенный ниже код является каркасом Perl-программы для обработки некоторых файлов со структурированным текстом. Программа работает должным образом, если ввод осуществляется через STDIN:
./process_files.pl < some_file
Но он зависает, если обрабатываемый файл является аргументом командной строки:
./process_files.pl some_file
Запуск этого режима показал, что после чтения файла программа зависла на read(0, ...)
. И, конечно же, набрав Ctrl-D на терминале, вы отклеиваете программу, и она запускается до конца.
Почему Perl ожидает на STDIN после чтения из непустого @ARGV?
Код Perl:
#!/usr/bin/perl
sub meta
{
while ( <> )
{
return if m!</META>!;
# process metadata line
}
}
sub data
{
while ( <> )
{
return if m!</DATA>!;
# process data line
}
}
while ( <> )
{
meta if m!<META>!;
data if m!<DATA>!;
}
# post processing here
exit 0;
ADDENDUM: строки обрабатываемого текстового файла имеют следующий шаблон:
lines (ignored)
<META>
meta data lines (processed)
</META>
lines (ignored)
<DATA>
data lines (processed)
</DATA>
optional lines (ignored)