привет у меня есть некоторые проблемы с этим perl -wne' while - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть некоторые проблемы с этим

perl -wne 'while(/(?:(?:\b00|+)08[. ]?)?3\d{2}[. ]?\d{6,7}\b/){print "$&\n"}' *.txt >save
cat save |sort|uniq>mmm
wc -l mmm 

Как из файла можно извлечь некоторые телефонные номера .. номера начинаются с 08 ..

1 Ответ

0 голосов
/ 09 ноября 2018

Проблема 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" }

Если у вас по-прежнему возникают проблемы, включите примеры ваших входных данных, ожидаемых результатов и всех сообщений об ошибках, которые вы наблюдаете при выполнении кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...