2015-05-07 4 views
6

Sono completamente nuovo per Perl e cercando di progettare un lexer in cui mi sono imbattuto:Qual è il significato di qr // in perl

my @token_def = 
(
     [Whitespace => qr{\s+},  1], 
     [Comment => qr{#.*\n?$}m, 1], 
); 

e anche dopo aver attraversato più siti non ho capito il senso.

+3

http://perldoc.perl.org/functions/qr .html – Mat

risposta

4

qr// è documentato in perlop nella sezione "Regexp Quote-Like Operators".

Proprio come qq"..." alias "..." consente di costruire una stringa, qr/.../ consente di costruire un'espressione regolare.

$s = "abc";  # Creates a string and assigns it to $s 
$s = qq"abc"; # Same as above. 
print("$s\n"); 

$re = qr/abc/; # Creates a compiled regex pattern and assigns it to $x 
print "match\n" if $s =~ /$re/; 

Le regole di quoting per qr/.../ sono molto simili a qq"..." 's. L'unica differenza è che \ seguito da un carattere non di parole viene passato invariato.

7

qr// è uno degli operatori di tipo preventivo che si applicano alla corrispondenza del modello e alle attività correlate.

Da perldoc:

questo operatore citazioni (e possibilmente compila) la sua STRING come un'espressione regolare. STRING viene interpolato allo stesso modo di PATTERN in m/PATTERN /. Se come delimitatore viene utilizzato ', non viene eseguita alcuna interpolazione.

Da modern_perl:

qr // operatore crea espressioni regolari di prima classe. li Interpolare nell'operatore partita usarli:

my $hat = qr/hat/; 
say 'Found a hat!' if $name =~ /$hat/; 

... o combinare più oggetti regex in modelli complessi:

my $hat = qr/hat/; 
my $field = qr/field/; 

say 'Found a hat in a field!' 
if $name =~ /$hat$field/; 

like($name, qr/$hat$field/, 
      'Found a hat in a field!');