Que signifie cette expression rationnelle Perl moyenne: m/(.*?):(.*?)$/g?
Je suis de l'édition d'un dossier de Perl, mais je ne comprends pas cette regexp comparaison. Quelqu'un peut-pourriez-vous m'expliquer?
if ($lines =~ m/(.*?):(.*?)$/g) { } ..
Ce qui se passe ici? $lines
est une ligne d'un fichier texte.
- Ressemble à première
(.*?)
toujours correspondre à la chaîne vide. - Pas toujours. Il va correspondre tous les caractères jusqu'à la première du côlon.
Vous devez vous connecter pour publier un commentaire.
La diviser en plusieurs parties:
Donc, ce sera le match des chaînes de caractères comme
":"
(il correspond à zéro des personnages, puis une virgule, puis zéro caractères avant la fin de la ligne,$1
et$2
sont des chaînes vides), ou"abc:"
($1 = "abc"
,$2
est une chaîne vide), ou"abc:def:ghi"
($1 = "abc"
et$2 = "def:ghi"
).Et si vous passez dans une ligne qui ne correspond pas (il semble que ce serait si la chaîne ne contient pas de deux-points), alors il ne sera pas procédé le code à l'intérieur des parenthèses. Mais si c'est le match, puis le code à l'intérieur des parenthèses peut l'utiliser et le processus de la spéciale
$1
et$2
variables (au moins jusqu'à la prochaine expression régulière se montre, s'il en est dans les crochets).Il est un outil pour aider à comprendre les regexes: YAPE::Regex::Expliquer.
Ignorant la
g
modificateur, qui n'est pas nécessaire ici:Voir aussi perldoc perlre.
Il a été écrit par quelqu'un qui en sait trop sur les expressions régulières, ou pas assez sur le
$'
et $` variables.Cela pourrait avoir été écrit comme
ou
(.*?)
capture de caractères, mais comme quelques-uns d'entre eux que possible.Donc il cherche des modèles comme
<something>:<somethingelse><end of line>
, et s'il y a plusieurs:
dans la chaîne, le premier sera utilisé comme séparateur entre<something>
et<somethingelse>
.Cette ligne indique à effectuer une expression régulière sur
$lines
avec les regexm/(.*?):(.*?)$/g
. Il sera en fait de retourtrue
si un match ne peut être trouvé dans$lines
etfalse
si on ne peut pas être trouvé.Une explication de la
=~
opérateur:La regex est lui-même:
Donc si
$lines
correspond à l'encontre de cette regex, il va aller dans la réserve de la partie, sinon, il serafalse
et le sauter.