/ / Ruby: Warum bekomme ich hier eine Warnung "regex literal in condition"? - Rubin

Ruby: Warum bekomme ich hier eine Warnung "regex literal in condition"? - Rubin

Ein einfaches Ruby-Programm, das gut funktioniert (mit Ruby 2.0.0):

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

Ruby gibt jedoch auch die Warnung aus Warnung: Regex-Literal in Bedingung. Es scheint, dass Ruby meinen Flip-Flop-Ausdruck /foo/../bar/ als gefährlich ansieht.

Meine Frage: Wo liegt die Gefahr in diesem Programm? Und: Kann ich diese Warnung abschalten (idealerweise nur für diese Aussage, andere Warnungen aktiv)?

BTW, ich fand im Internet mehrere Diskussionen über diese Art von Code, erwähnte auch die Warnung, fand aber nie eine gute Erklärung, warum wir gewarnt werden.

Antworten:

5 für die Antwort № 1

Sie können die Warnung vermeiden, indem Sie eine explizite Übereinstimmung verwenden:

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

Regexp#~ passt gegen $_.

Ich weiß es nicht Warum Die Warnung wird angezeigt (um ehrlich zu sein, ich war mir nicht einmal bewusst, dass Ruby regexp Literale gegen $_ implizit), aber nach der Parser "s QuellcodeEs wird angezeigt, es sei denn, Sie stellen die -e Option beim Aufruf von Ruby, d. h. Weitergabe des Skripts als Argument:

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

Ich würde es vermeiden zu benutzen $_ als impliziter Parameter und verwenden Sie stattdessen etwas wie:

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

0 für die Antwort № 2

Ich denke, Neil Slater hat recht: Es sieht aus wie ein Fehler in einem Parser. Wenn ich den Code zu ändern

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

Die Warnung verschwindet.

Ich werde einen Fehlerbericht einreichen.