Как я могу сопоставить несколько регулярных выражений в Perl? - PullRequest
5 голосов
/ 21 мая 2011

Я видел этот предыдущий пост о сопоставлении с несколькими регулярными выражениями Как мне сопоставить несколько регулярных выражений в Perl?

Я ищу самый быстрый способ сопоставить все значения, содержащиеся в массиве, с очень большим файлом (500 МБ).

Шаблоны читаются из стандартного ввода и могут содержать специальные символы, которые должны использоваться в регулярном выражении (якоря, классы символов и т. Д.). Совпадение должно произойти, когда все шаблоны содержатся в текущей строке.

В настоящее время я использую вложенный цикл, но я не очень доволен скоростью ....

Спасибо за ваши предложения.

Ответы [ 2 ]

8 голосов
/ 21 мая 2011

Попробуйте Regexp :: Assemble , как предлагается в посте, на который вы ссылаетесь, и сравните его с итеративным подходом, подобным grep. Regexp :: Assemble должен дать самое быстрое решение, поскольку Perl может оптимизировать объединенные регулярные выражения, а не сканировать целую строку для каждого. Так как вы не знаете свой вклад заранее, ymmv.

Какая версия Perl, которую вы используете, повлияет на производительность. 5.10 ввел много оптимизаций именно для этой цели (см. « попытки »). Одним из наиболее распространенных вариантов использования являются сканеры спама, такие как SpamAssassin, которые создают большое регулярное выражение для всех шаблонов, которые они сканируют, точно так же как Regexp :: Assemble.

Наконец, так как ваш ввод настолько велик, возможно, стоит собрать регулярное выражение в файл и затем запустить grep -P -f $regex_file $big_file. -P говорит grep использовать Perl-совместимые регулярные выражения. Файл используется, чтобы избежать цитирования оболочки или ограничений размера команд. grep может взорвать двери от Perl.

В конце концов, вам придется провести сравнительный анализ.

4 голосов
/ 21 мая 2011

Вы пробовали использовать grep?

while($line=<>) {
    if (scalar(grep($line=~/$_/,@regexps))==scalar(@regexps)) {
       # ... All matched
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...