/ / Ruby: ¿Por qué recibo la advertencia "regex literal in condition" aquí? - rubí

Ruby: ¿Por qué aparece la advertencia "regex literal en condición" aquí? - ruby

Un programa simple de Ruby, que funciona bien (usando Ruby 2.0.0):

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

Sin embargo, Ruby también emite la advertencia. advertencia: expresiones regulares en condiciones. Parece que Ruby considera mi expresión de flip-flop /foo/../bar/ como peligrosa.

Mi pregunta: ¿Dónde está el peligro en este programa? Y: ¿Puedo desactivar esta advertencia (idealmente solo para esta declaración, manteniendo otras advertencias activas)?

Por cierto, encontré en la red varias discusiones sobre este tipo de código, también mencionando la advertencia, pero nunca encontré una buena explicación de por qué nos advirtieron.

Respuestas

5 para la respuesta № 1

Puedes evitar la advertencia utilizando una coincidencia explícita:

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

Regexp#~ partidos contra $_.

No lo sé por qué se muestra la advertencia (para ser honesto, ni siquiera estaba consciente de que Ruby compara los literales de expresión regular con $_ implícitamente), pero de acuerdo con la código fuente del analizador, se muestra a menos que proporcione el -e Opción al invocar a Ruby, es decir, pasar la secuencia de comandos como un argumento:

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

Yo evitaria usar $_ como un parámetro implícito y en su lugar usa algo como:

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

0 para la respuesta № 2

Creo que Neil Slater tiene razón: parece un error en un analizador. Si cambio el código a

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

La advertencia desaparece.

Voy a presentar un informe de error.