44 votes

Parcourir chaque correspondance en Perl

Disons que je parcours une page de html brut à la recherche de cette regex. (La quote à la fin est intentionnelle).

m/(https?:\/\/.*?(?:'|"))/

Ce motif est susceptible de correspondre ~ 100 fois. Quel est un idiome Perl commun/un moyen rapide d'itérer à travers une liste de toutes les correspondances des groupes de capture ?

64voto

stema Points 36113

De la perlretut (un très bon tutoriel)

while ($x =~ /(\w+)/g) {
    print "Le mot est $1, se termine à la position ", pos $x, "\n";
}

Vous pouvez utiliser while avec le modifieur g pour itérer sur toutes les correspondances, avec $1 vous obtenez le contenu de votre groupe de capture 1, et dans cet exemple du tutoriel vous obtenez également la position avec pos.

8voto

Zaid Points 21192

Le modificateur global 'g' retourne une liste des correspondances capturées en contexte de liste :

say $_ for $str =~ /un($wanted)/g;    # Imprime seulement $wanted

1voto

Samiron Points 2457

@Zaid: Je pense que votre approche est plus compacte. J'espère que le snippet suivant vous aidera à comprendre votre exemple

my $str = 'file_%date%_%name%_%lang%.txt';
my @ts = $str =~ /%([\w]+)%/g;#           <----------Zaid a dit
print join(", ", @ts);

Sortie:

date, name, lang

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X