Переключатель -p
заставляет Perl выполнять итерацию по каждой строке ввода и выполнять заданный код для каждого из них (и впоследствии печатать строки).В частности, команда
perl -p -e 'SOME_CODE_HERE;'
в точности эквивалентна запуску следующей Perl-программы:
LINE: while (<>) {
SOME_CODE_HERE;
} continue {
print or die "-p destination: $!\n";
}
Кажется, что ваше регулярное выражение предназначено для одновременного совпадения с несколькими строками, что, очевидно, не будетработать, если Perl обрабатывает ввод построчно.Чтобы заставить его работать как задумано, у вас есть (как минимум) две опции:
Измените представление Perl о том, что представляет собой линия, с помощью переключателя -0<i>NNN</i>
.В частности, переключатель -0777
заставляет Perl обрабатывать каждый входной файл как одну «строку».
Переписать свой код, например, с использованием триггера ..
оператор .
Кстати, я сильно подозреваю, что ваше регулярное выражение не означает, что вы думаете, что оно означает.В частности, [^\^]+
соответствует строке из одного или нескольких символов, которая не содержит каретку (^
).Поскольку ваши входные данные, по-видимому, не содержат никаких вставок, это, по сути, эквивалентно (?s:.+)
(или просто .+
, если вы используете модификатор /s
).