(contributo di brian d foy )
Evitando di chiedere al Perl di compilare una espressione regolare
ogni qualvolta volete effettuarne il match. In questo esempio, perl deve
ricompilare l'espressione regolare per ogni iterazione del ciclo foreach(),
visto che non ha modo di conoscere cosa sarà $pattern.
@pattern = qw( foo bar baz );
LINE: while( <> )
{
foreach $pattern ( @pattern )
{
print if /\b$pattern\b/i;
next LINE;
}
}
L'operatore qr// comparì nel perl 5.005. Esso compila
una espressione regolare, ma non la usa. Quando utilizzate la
versione precompilata della espressione regolare, il perl compie
meno lavoro. In questo esempio, si è inserito un map() per
convertire ogni pattern nella sua forma precompilata. Il resto dello
script è lo stesso, ma più veloce.
@pattern = map { qr/\b$_\b/i } qw( pippo pluto paperino );
LINE: while( <> )
{
foreach $pattern ( @pattern )
{
print if /\b$pattern\b/i;
next LINE;
}
}
In alcuni casi, potreste essere in grado di comporre diversi pattern in
una singola espressione regolare. Tuttavia fate attenzione a situazioni che
richiedono il backtracking.
$espres_reg = join '|', qw( pippo pluto paperino );
LINE: while( <> )
{
print if /\b(?:espres_reg)\b/i;
}
Per maggiori dettagli sull'efficienza delle espressioni regolari, consultate
Mastering Regular Expressions di Jeffrey Freidl. Egli spiega come funziona il
motore delle espressioni regolari e perché alcuni pattern sono
sorprendentemente inefficienti. Una volta che avete capito come il perl
usa le espressioni regolari, potete regolarle per le singole situazioni.
|