Le " o " modificateur pour les expressions régulières de Perl encore fournir toute prestation?
Il utilisé pour être considéré comme bénéfique pour inclure le " o " modificateur à la fin des expressions régulières de Perl. L'actuel Documentation Perl ne semble même pas de liste, et certainement pas à la la section de modificateurs de perlre.
Ne fournit aucun avantage maintenant?
Il est encore accepté, pour des raisons de rétro-compatibilité, si rien d'autre.
Comme le fait remarquer J Un Faucett et brian d foy, le " o " modificateur est toujours documenté, si vous trouvez les bons endroits pour chercher (dont un qui n'est pas le perlre
de la documentation). Il est mentionné dans la perlop pages. Il est également trouvé dans la perlreref pages.
Comme indiqué par Alan M dans l'acceptation de réponse, la meilleure technique moderne est généralement à utiliser les qr//(cité regex) de l'opérateur.
- La page que vous mentionnez ne décrivent l'option /o, mais seulement dans les descriptions de qr// et m// opérateurs.
- Un Faucett: Hmm, je ne le vois pas sur la page, mais vous pouvez les trouver il mentionné dans le perlop (perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators) pages. Il n'était pas répertoriée dans l'endroit évident. J'ai aussi trouvé qu'il figure dans le perlreref (perldoc.perl.org/perlreref.html).
Vous devez vous connecter pour publier un commentaire.
Je suis sûr que c'est toujours pris en charge, mais c'est assez obsolète. Si vous voulez que la regex pour être compilé une seule fois, il est préférable d'utiliser un objet regex, comme suit:
L'interpolation de
$bar
est effectuée lorsque la variable est initialisée, de sorte que vous aurez toujours utiliser la mise en cache, compilé regex à partir de là, dans le cadre englobant. Mais parfois, vous voulez la regex pour être recompilé, parce que vous voulez qu'il utilise la variable nouvelle valeur. Voici l'exemple Friedl utilisé dans Le Livre:Dans le champ d'application de la fonction, la valeur de $today_regex reste le même. Mais la prochaine fois que la fonction est appelée, la regex sera recompilé avec la nouvelle valeur de
$today
. Si il avait juste utilisé...la regex ne serait jamais mis à jour. Ainsi, avec l'objet de formulaire que vous avez de l'efficacité de l' /o sans sacrifier la flexibilité.
La
/o
modificateur est dans le perlop de la documentation à la place de la perlre de la documentation, car il s'agit d'une citation comme modificateur plutôt qu'une regex modificateur. Qui m'a toujours semblé étrange pour moi, mais c'est comment il est. Depuis Perl 5.20, c'est maintenant répertoriée dans perlre simplement de noter que vous ne devriez probablement pas l'utiliser.Avant de Perl 5.6, Perl serait recompiler le regex, même si la variable n'a pas changé. Vous n'avez pas besoin de faire cela. Vous pouvez utiliser
/o
pour compiler les regex une fois, malgré les changements de la variable, mais comme les autres réponses noté,qr//
est de mieux pour cela.Dans le Perl 5 version 20.0 documentation
http://perldoc.perl.org/perlre.html
c'états
qui peut être une façon humoristique de dire que c'était censé effectuer une optimisation, mais la mise en œuvre est cassé.
Ainsi, l'option peut être préférable de l'éviter.
/o
drapeau comme une promesse faite par le programmeur que la regexp ne changera pas, alors je ne pense pas que ce soit de ces comportements est un bug. Le programmeur dit au compilateur: "je peux vous assurer que cette regexp interpolation $foo ne changera pas à partir de quand il est d'abord compilé, donc faire ce que les optimisations que vous voyez l'ajustement à l'aide de cette connaissance. Le compilateur peut alors choisir de les recompiler le regexp ou pas (bien que manifestement pas recompiler, il sera généralement plus rapide). Cela dit, la documentation d'origine pour/o
n'ai pas vraiment le décrire en ces termes.Cette optimisation dans le cas que la regex comprend une variable de référence. Il indique que la regex ne change pas, même si elle a une variable à l'intérieur d'elle. Cela permet des optimisations qui ne serait pas possible autrement.
Voici les horaires pour les différentes façons d'appel correspondant.
Mon code:
Une chose, c', mystifyingly, ne pas n'est qu'une FOIS le bloc, au moins à 5.8.8.
perl -le 'for (1..3){
print;
m/${\(print( "between 1 and 2 only"), 3)}/o and print "matched"
}'