Regexp::Assemble

Regexp::Assemble

David Landgren
<david@landgren.net>

Fondateur, Paris Perl Mong(u)e\R1rs

Il était une fois

  • trop de spam

  • trop de virus

  • trop de lignes ADSL se connectant sur mon MTA

  • souvent facile à identifier grâce au résolution inverse DNS

Dis moi qui tu es

  • 64-80-231-201.fibertel.com.ar

  • host-67-84-230-24.midco.net

  • host-89-229-2-176.torun.mm.pl

  • host-213-213-233-44.brutele.be

  • ppp-58.10.219.243.revip2.asianet.co.th

  • 68-67-200-36.atlaga.adelphia.net

Vous, et les gens comme vous

  • \d+-\d+-\d+-\d+\.fibertel\.com\.ar

  • host-\d+-\d+-\d+-\d+\.midco\.net

  • host-\d+-\d+-\d+-\d+\.torun\.mm\.pl

  • host-\d+-\d+-\d+-\d+\.brutele\.be

  • ppp-\d+\.\d+\.\d+\.\d+\.revip\d+\.asianet\.co\.th

  • \d+-\d+-\d+-\d+\.atlaga\.adelphia\.net

Postfix access maps

Postfix peut se paramétrer directement à partir de ces regexps

  • via la librarie PCRE

  • mais les appliquent séquentiellement

  • problème de performance

  • une seule expression serait préférable

Regexp::Assemble

  (?:
    host-\d+-\d+-\d+-\d+\.
    (?:
      torun\.mm\.pl
      |brutele\.be
      |midco\.net
    )
    |\d+-\d+-\d+-\d+\.
    (?:
      atlaga\.adelphia\.net
      |fibertel\.com\.ar
    )
    |ppp-\d+\.\d+\.\d+\.\d+\.revip\d+\.asianet\.co\.th
  )

Aujourd'hui

  • 4096 expressions régulières

  • 136 467 octets

  • assemblé, 90 549 octets

  • coût d'ajouter une expression additionelle...

  • ... quasi nul

Comportement émergent

  • vu dans les tests

  • sad | salad | spread

  • j'ai rêvé : s(pre|al)?ad

  • il l'a fait : s(?:(?:al)?|pre)ad

  • remarque : s(pre|al|)ad ferait l'affaire aussi

Regexps suivis (tracked)

  • permet de d'assembler de multiples expressions

  • et recupérer celle qui a declenché le match

  • indexer un hash de coderefs (dispatch table)

  • un peu lourd en 5.8, à cause d'un bug dans le moteur regexp

  • vient d'être corrigé dans bleadperl

Problèmes

  • be by me my devrait produire '[bm][ey]'

  • mais cela produit '(?:b[ey]|m[ey)'

  • c'est correct, mais pas génial

  • _lex() est lent, vraiment lent (a+b*c? => a+, b*, c?)

  • _fastlex() est un peu mieux (utilise \G), mais...

  • ... ne marche pas en 5.6, et j'ai introduit un bug

Désirs

Introduire de curlies.

  (?:
    host(?:-\d+){4}\.
    (?:
      torun\.mm\.pl
      |brutele\.be
      |midco\.net
    )
    |\d+(?:-\d+){3}\.
    (?:
      atlaga\.adelphia\.net
      |fibertel\.com\.ar
    )
    |ppp-(?:\d+\.){4}revip\d+\.asianet\.co\.th
  )

Questions

Merci