42 votes

Le modificateur 'o' des expressions rationnelles Perl présente-t-il encore des avantages?

Il a utilisé pour être considéré comme bénéfique pour inclure le " o " modificateur à la fin des expressions régulières de Perl. Le courant de documentation Perl ne semble même pas de liste, et certainement pas à la section de modificateurs de perlre.

N'apporte aucun avantage, maintenant?

Il est toujours 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 l'un n'est pas l' perlre 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.

38voto

Alan Moore Points 39365

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:

my $reg = qr/foo$bar/;

L'interpolation de la $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:

sub CheckLogfileForToday()
{
  my $today = (qw<Sun Mon Tue Wed Thu Fri Sat>)[(localtime)[6]];

  my $today_regex = qr/^$today:/i; # compiles once per function call

  while (<LOGFILE>) {
    if ($_ =~ $today_regex) {
      ...
    }
  }
}

Dans le cadre 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 venait de s'en servir

if ($_ =~ m/^$today:/io)

...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é.

19voto

brian d foy Points 71781

L' /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.

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 de compiler les regex une fois, malgré les changements de la variable, mais comme les autres réponses noté, qr// est de mieux pour cela.

4voto

denis phillips Points 7349

Ceci est une optimisation dans le cas où la regex inclut une référence de variable. Cela indique que l'expression régulière ne change pas même si elle contient une variable. Cela permet des optimisations qui ne seraient pas possibles autrement.

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