2012-05-23 6 views
5

Warum tritt dieser Fehler auf?Ruby Regexp Interpolation/Zeichenklasse/Syntax der globalen Variablen Clash?

Regexp.new("[#$]") 
    # => SyntaxError: (irb):1: syntax error, unexpected $undefined 
    # => Regexp.new("[#$]") 
    #   ^
    # (irb):1: unterminated string meets end of file 
    #  from ~/.rvm/rubies/ruby-1.9.3-p194/bin/irb:1:in `<main>' 

Dies sollte die Teilmenge von Strings beschreiben entweder aus einer einzelnen $ oder # bestehend, buchstäblich. Und, AFAIU Ruby's Regexp engine, # und $don't need to be escaped innerhalb einer Zeichenklasse, obwohl sie in der Regel Metazeichen sind.

Ich würde von der Fehlermeldung vermuten, dass Ruby versucht, $ zu interpolieren, wenn es # in doppelten Anführungszeichen trifft, aber ... warum? Bestellung ist wichtig. Die $ und # Zeichen haben mehrere überladene Verhaltensweisen, so bin ich ratlos über das, was dies auslöst.

PS, FYI:

/[#$]/ 
    # => SyntaxError: (irb):1: syntax error, unexpected $undefined 
    /[$#]/ 
    # => /[$#]/ 
    Regexp.new '[$#]' 
    # => /[$#]/ 
    Regexp.new '[#$]' 
    # => /[#$]/ 
    Regexp.new "[#$]" 
    # => SyntaxError: (irb):1: syntax error, unexpected $undefined 
+0

möglich Duplikat [Stumped durch eine einfache regex] (http://stackoverflow.com/questions/9493100/stumped-by-a-simple-regex) –

+0

http://books.google.ca/books?id=jcUbTcr5XWwC&pg=PA48&lpg=PA48&dq=ruby+global+variable+interpolation&source=bl&ots=fIDnyi9zjG&sig=BqcdRjtCnj3pj-PCtcMYh7UHS18&hl=en&sa=X&ei=Ci29T8IJgZOJArLYzewN&ved=0CFoQ6AEwAw#v=onepage&q=ruby % 20global% 20variable% 20interpolation & f = false –

+0

@muistooshort: ja, du hast Recht: Beide Fragen hatten die gleiche Antwort. – pje

Antwort

7

Das Problem ist nicht $, aber #, wie #... in der Regel für variable Expansion in doppelten Anführungszeichen Strings verwendet wird. Wie "#{x}".

Aber die Sache ist, dass Sie auch globale Variablen direkt #$global mit erweitern können, und das erklärt, Ihr Problem:

$global = "hello" 
"#$global" 
=> "hello" 

So ist die Lösung entweder#oder$, zu entkommen, da dies brechen die Zeichenfolgeninterpolations-Zustandsmaschine, um das Konstrukt als eine Interpolation zu interpretieren:

EDIT

Und es nur, um wirklich klar :) Das Problem ist nicht die Regexp ist, aber Sie versuchen, eine globale Variable $] Namen zu erweitern, wenn Sie "#$]" Typ:

puts "#$]" 
SyntaxError: (irb):22: syntax error, unexpected $undefined 

zu beheben es braucht man etwas zu entkommen:

puts "\#$]" 
=> #$] 
+0

+1, aber konnten Sie nicht auch das Problem lösen, indem Sie die Positionen der Symbole vertauschen (d. H. '[$ #]')? Ich spreche Ruby nicht fließend, aber laut der Dokumentation wird '#' als Literal behandelt, es sei denn, es folgt '{', '$' oder '@'. –

+1

@AlanMoore - Ja das stimmt, Neuordnung löst es auch. Das OP merkte dies jedoch auch in seinem Text * "... Ordnung ist wichtig ..." * an. – Casper

+0

Ich weiß nicht, was das heißen soll, aber die Reihenfolge der Zeichen in einer Zeichenklasse kann nicht signifikant sein (abgesehen von denen, die spezielle Bedeutungen wie '^' und '-' haben). –