Проблема 1: +
- метасимвол, который вам нужно экранировать, иначе вы увидите сообщение об ошибке
Quantifier follows nothing in regex; marked by <-- HERE in m/(?:(?:\b00|+ <-- HERE
Поэтому измените выражение в этой группе на (?:\b00|\+)
Проблема 2: while (condition) { ... }
- бесконечный цикл, если condition
истинно и если condition
не изменяется внутри цикла.
Когда скрипт находит совпадение, цикл while никогда не прекращается и выводит первое найденное совпадение в файл save
навсегда.
Альтернативой while (/.../) { print $& }
, которая будет делать то, что вы имеете в виду, является for (/.../g) { print $_ }
. Модификатор /g
просит Perl найти как можно больше совпадений на входе. Конструкция for (LIST) { ... }
загружает каждый элемент списка в переменную темы $_
.
Обновленный скрипт теперь выглядит так:
for(/(?:(?:\b00|\+)08[. ]?)?3\d{2}[. ]?\d{6,7}\b/g) { print "$_\n" }
Если у вас по-прежнему возникают проблемы, включите примеры ваших входных данных, ожидаемых результатов и всех сообщений об ошибках, которые вы наблюдаете при выполнении кода.