web-dev-qa-db-fra.com

Perl itérer à travers chaque match

Supposons que je scanne une page de code HTML brut à la recherche de cette expression régulière. (Le guillemet à la fin est intentionnel).

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

Ce modèle est susceptible de correspondre à environ 100 fois. Qu'est-ce qu'un idiome Perl commun/un moyen rapide de parcourir une liste de toutes les correspondances de groupe de capture?

36
providence

De la perlretut (un très bon tutoriel)

while ($x =~ /(\w+)/g) {
        print "Word is $1, ends at position ", pos $x, "\n";
    }

Vous pouvez utiliser while avec le modificateur g pour parcourir 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.

56
stema

Le modificateur de correspondance globale "g" renvoie une liste des correspondances capturées dans le contexte de la liste:

say $_ for $str =~ /un($wanted)/g;    # Prints only $wanted
7
Zaid

@Zahid: Je pense que votre approche est plus compacte. j'espère que l'extrait suivant vous aidera à comprendre votre exemple

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

Production:

date, name, lang
0
Samiron