perl: чтение и обработка файла по частям

#perl

#perl

Вопрос:

Я надеюсь, что этот вопрос не слишком простой — я довольно неопытен в perl. Моя проблема: я хочу читать и обрабатывать файл по частям, но разделители фрагментов могут отличаться. У меня есть весь файл в переменной $text . В качестве примера:

 One

Two

BEGIN

Three

Four

END

Five
 

Я хочу пошагово просматривать этот файл по частям. Я хочу прочитать до следующей
пустой строки и сохранить (и обработать) результат как один фрагмент, поэтому «Один» и
«Два» будут первыми двумя фрагментами. Если новый фрагмент начинается с
ключевого слова «BEGIN», я хочу читать и обрабатывать до ключевого слова «END», поэтому
фрагмент будет «Three n Four». Как бы я это сделал в perl?

Я читал о функции «index», но не смог заставить ее пройти через мой $text.

Большое спасибо!

Ответ №1:

Вы можете установить разделитель входных записей на пустую строку, чтобы включить режим «абзац». Затем используйте оператор триггера для обработки диапазона между НАЧАЛОМ / КОНЦОМ; что-то вроде:

 perl -nle '$/="";if (/^BEGIN/../^END/) {print "> $_"} else {print "[ $_ ]"}' myfile
 

Комментарии:

1. Спасибо, оператор триггера действительно похож на то, что я искал. Моя проблема сейчас в том, как мне разорвать цикл в конце инструкции if? Потому что, насколько я понимаю, else будет возвращать true навсегда?

2. Оператор range возвращает true, когда первое выражение имеет значение true . Это остается в силе до тех пор, пока второе выражение не будет истинным, что затем приводит к тому, что оператор диапазона возвращает false . В показанном фрагменте кода дополнительные последовательности BEGIN ..END будут обрабатываться так же, как вы видели. Если вы используете ?BEGIN? ..?END? вместо /BEGIN/../END/ тогда вообще будет сопоставляться только первый блок «BEGIN-END».

3. Да, извините, вы абсолютно правы. Я пытался поместить ваш код в сценарий perl и запустить его для всего файла, объединенного в одну переменную; он работает с оператором diamond .