2017-10-20 29 views
0

Im un perl noob et j'ai essayé de développer un script simple pour capturer certaines valeurs d'une regex. Jusqu'à présent, j'ai construit le programme suivant:Erreur dans Perl: quantificateurs imbriqués dans regex

#!/usr/bin/perl 

use strict; 
$/ = ''; 

my $PM = qr{\b[A-Z][\w-]*\w}; 
my $de = qr{d[aoe]s?}; 
my $s = qr{[\n ]}; 
my $np = qr{$PM (?: $s $PM | $s $de $s $PM)*}x; 

my $window_size = 7; 
my $window = qr{($np) (?: $s+ (\w+))*}; 

while(<>){ 
    while(/($np) (?: $s+ (?: [\w-]+ | ($np))) ** {0..$window_size} /xg){ 
     print("\$1: $1 and \$2: $2 \n"); 
    } 
} 

Cependant, lorsque je tente d'exécuter ce code, il me montre l'erreur suivante:

Nested quantifiers in regex; marked by <-- HERE in m/((?^ux:(?^u:\b[A-Z][\w-]*\w) (?: (?^u:[\n ]) (?^u:\b[A-Z][\w-]*\w) | (?^u:[\n ]) (?^u:d[aoe]s?) (?^u:[\n ]) (?^u:\b[A-Z][\w-]*\w))*)) (?: (?^u:[\n ])+ (?: [\w-]+ | ((?^ux:(?^u:\b[A-Z][\w-]*\w) (?: (?^u:[\n ]) (?^u:\b[A-Z][\w-]*\w) | (?^u:[\n ]) (?^u:d[aoe]s?) (?^u:[\n ]) (?^u:\b[A-Z][\w-]*\w))*)))) ** <-- HERE {0..7}/at ./main.pl line 22, <> chunk 1. 

Pourquoi ce ne fonctionne pas?

EDIT: J'essaie d'utiliser l'opérateur ** comme quantificateur général, suivi d'une plage. J'ai lu qu'il est équivalent au quantificateur {range min, range max}

+4

Que voulez-vous dire ici par ** **? –

+1

Quelle est la chaîne que vous essayez de faire correspondre? – Barmar

+2

Vous semblez confondre Perl et Perl6. '** {0..7}' ressemble à ce que ferait une grammaire Perl6. – melpomene

Répondre

0

Si vous ne correspondez à rien d'autre que la chaîne littérale avec "**", vous devrez alors l'échapper.

/($np) (?: $s+ (?: [\w-]+ | ($np))) \*\* {0..$window_size}/