/ / Ruby: Pourquoi est-ce que je reçois un avertissement «état regex literal» ici? - rubis

Ruby: Pourquoi est-ce que je reçois un avertissement «regex literal in condition» ici? - rubis

Un programme Ruby simple, qui fonctionne bien (avec Ruby 2.0.0):

#!/usr/bin/ruby
while gets
print if /foo/../bar/
end

Cependant, Ruby affiche également l'avertissement warning: l'état de regex littéral. Il semble que Ruby considère mon expression de bascule /foo/../bar/ comme dangereuse.

Ma question: où est le danger dans ce programme? Et: Puis-je désactiver cet avertissement (idéalement, uniquement pour cette déclaration, en gardant les autres avertissements actifs)?

BTW, j'ai trouvé sur le net plusieurs discussions sur ce type de code, mentionnant également l'avertissement, mais je n'ai jamais trouvé une bonne explication de la raison pour laquelle nous sommes avertis.

Réponses:

5 pour la réponse № 1

Vous pouvez éviter l'avertissement en utilisant une correspondance explicite:

while gets
print if ~/foo/..~/bar/
end

Regexp#~ matchs contre $_.

Je ne sais pas Pourquoi l'avertissement est affiché (pour être honnête, je ne savais même pas que Ruby correspond aux littéraux d'expressions rationnelles contre $_ implicitement), mais selon le le code source de l'analyseur, il est affiché sauf si vous fournissez le -e lorsque vous appelez Ruby, c’est-à-dire en transmettant le script en tant qu’argument:

$ ruby -e "while gets; print if /foo/../bar/ end"

J'éviterais d'utiliser $_ en tant que paramètre implicite et utilisez plutôt quelque chose comme:

while line = gets
print line if line=~/foo/..line=~/bar/
end

0 pour la réponse № 2

Je pense que Neil Slater a raison: cela ressemble à un bug dans un analyseur syntaxique. Si je change le code en

#!/usr/bin/ruby
while gets
print if $_=~/foo/..$_=~/bar/
end

l'avertissement disparaît.

Je vais déposer un rapport de bogue.