2009-06-04 7 views

risposta

57

Per letterale (statico) regex non c'è niente da fare - perl compilerà solamente una volta.

Per le regex memorizzate nelle variabili sono disponibili un paio di opzioni. È possibile utilizzare l'operatore qr// di costruire un oggetto di espressione regolare:

my $re = qr/foo|bar/; 

if ($var =~ $re) { 
    # ... 
} 

Questo è utile se si desidera utilizzare una regex in più luoghi o passarlo a subroutine.

Se l'espressione regolare è in una stringa è possibile utilizzare l'opzione /o a promettere perl che non potrà mai cambiare:

my $pattern = 'foo|bar'; 

if ($var =~ /$pattern/o) { 
    # ... 
} 

Di solito è meglio non farlo, però. Perl è abbastanza intelligente da sapere che la variabile non è cambiata e che la regex non ha bisogno di essere ricompilata. Specificare /o è probabilmente un micro-ottimizzazione prematuro. È anche una potenziale trappola. Se la variabile è stata modificata con utilizzando /o, il perl utilizzerà comunque la regex precedente. Ciò potrebbe portare a una diagnosi difficile dei bachi.

+3

Questi sono veri; tuttavia, qr // è stato supportato per molti anni (esiste già dalle 5.005, e penso che non ci siano stati problemi dal 5.8) – ephemient

+8

@ephemient Bene, 5.10 ha una perdita di memoria fastidiosa associata a qr // (e alla compilazione delle regex in generale), ma è stato risolto. Se si utilizza 5.10, è possibile verificare se si dispone della perdita di memoria dicendo perl -e 'qr // while 1'. So che la versione OS X di ActiveState Perl 5.10 è ancora danneggiata. –

+2

Nota dal 2016: il modificatore '/ o' è stato deprecato. Vedi [questa domanda] (http://stackoverflow.com/q/550258/477563) per i dettagli. –

19

Semplice: controllare l'operatore qr // (documentato in perlop in Regexp Quote-Like Operators).

my $regex = qr/foo\d/; 
$string =~ $regex; 
+0

bello, sembra che possa essere usato come un modello nel costrutto s ///. È ancora pre-compilato o è compilato di nuovo in questo caso? – akostadinov

+0

@akostadinov È ancora pre-compilato. –

Problemi correlati