2015-02-10 8 views
6

È possibile sovrascrivere la sensibilità alla distinzione tra maiuscole e minuscole di una regex precedentemente definita in Perl? Per esempio, se dovessi avere il seguente:Sovrascrivi regex con distinzione tra maiuscole e minuscole in Perl

my $upper = qr/BLAH/x; 
my $lower = qr/$upper/xi; 
warn "blah" =~ $lower 

mi piacerebbe la terza linea per stampare un riscontro positivo.

+0

D'altra parte, si può fare "blah" maiuscola. – Stephan

+0

Purtroppo non ho il controllo su cosa cercherò. Questa è più una domanda di riutilizzo del codice, quindi non devo fare due regex molto simili che testano maiuscole o minuscole. –

risposta

9

È possibile aggiungere il /i alla regexp come segue:

use re qw(is_regexp regexp_pattern); 

sub make_re_case_insensitive { 
    my ($re) = @_; 

    return "(?i:$re)" if !is_regexp($re); 

    my ($pat, $mods) = regexp_pattern($re); 
    if ($mods !~ /i/) { 
     $re = eval('qr/$pat/'.$mods.'i') 
     or die([email protected]); 
    } 

    return $re; 
} 

Ma questo non influenzerà qr/(?-i:BLAH)/.


questo è più di una domanda riutilizzo del codice, quindi non c'è bisogno di fare due regex molto simile che prova maiuscolo o in minuscolo.

my $pat = 'BLAH'; 
my $re1 = qr/$pat/x; 
my $re2 = qr/$pat/xi; 
+0

Buona risposta e grazie per aver incluso il secondo commento. Non funziona se qualcosa nella stringa è regex specifico, come un carattere \ h. Quindi il mio $ pat = 'ABC \ hXYZ' non corrisponderà a 'abc xyz'. Segnalo come risposta accettata se non prevale nient'altro. –

+3

@DannySullivan: Sì, lo fa. 'my $ pat = 'ABC \ hXYZ'' e' dì 'ok' se 'abc xyz' = ~ $ re2' stampa' ok' – Borodin

+0

Chiamata eccellente, scusami mi sono perso. Questo e 'esattamente quello che stavo cercando. –

Problemi correlati