Zobrazují se příspěvky se štítkemperl. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemperl. Zobrazit všechny příspěvky

pondělí 12. března 2007

Perl a regulární výrazy s (?g)

Perl 5.6 měl při zpracování regulárních výrazů jednu pěknou nedokumentovanou vlastnost, která ve verzi 5.8 přestala fungovat.
V Perlu je možné modifikátory regulárního výrazu vložit přímo do samotného regulárního výrazu. Např. výraz odpovídající "a" bez ohledu na velikost písmen se dá napsat jako /a/i nebo se modifikátor může vložit přímo do výrazu jako /(?i)a/. To se hodí, pokud výraz není součástí zdrojového kódu, ale pochází odjinud.
Perl 5.6 neměl nic proti tomu, pokud se i modifikátor globálního hledání //g vložil do výrazu jako /(?g)/ a všechno fungovalo, jak má, i když v dokumentaci to nebylo nikde popsáno. Perl 5.8 se to ovšem rozhodl změnit a mě připravit opravdu perné chvilky :)

Následující příklad funguje jen v Perlu 5.6:
while ('xabyaczad' =~ m/(?g)a(.)/) { print $1; }

Pro Perl 5.8 je potřeba g "vytáhnout ven":
while ('xabyaczad' =~ m/a(.)/g) { print $1; }

Laskaví uživatelé RSS feedů nechť přijmou omluvu za několikadenní výpadek a za pomoc při řešení děkuju Marovi a Stěpánkovi.

středa 25. října 2006

Java a CGI

I když "Java a CGI" může znít jako nesmysl, u jednoho staršího projektu původně vytvořeného v Perlu a CGI došlo na rekonstrukci (do Javy), ale jedna část v CGI zůstala (funguje dobře, je celkem složitá a nikdo by její přepsání nezaplatil). Kupodivu to není žádný problém. Webový kontejner může spouštět programy jako CGI a jak Jetty tak Tomcat obsahují v základu servlet, který se v deployment deskriptoru web.xml namapuje třeba na koncovku *.cgi, a který se o spouštění CGI postará.
  • u Jetty to je org.mortbay.servlet.CGI
  • u Tomcatu pak org.apache.catalina.servlets.CGIServlet
(Tomcat dokonce obsahuje filtr, který umí zpracovat SSI.)

Rychlost jsem exaktně neměřil, ale jak klasický HTTP server tak webový kontejner musí vytvořit a spustit proces, něco mu předat na vstup a výstup pak poslat klientovi. Vzhledem k tomu, že vytvoření a spuštění procesu je v Javě implamentováno jako nativní funkce, myslím, že výkon by neměl být nějak zásadně horší.