2012-05-23 14 views
5

Perché si verifica questo errore?Ruby Regexp Interpolazione/Classe caratteri/Clima di sintassi variabile globale?

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>' 

descrive l'sottoinsieme di stringhe costituito da un singolo $ o #, letteralmente. E, AFAIU Ruby's Regexp engine, # e $don't need to be escaped all'interno di una classe di caratteri anche se in genere sono metacaratteri.

Indovino dal messaggio di errore che Ruby sta cercando di interpolare $ quando sta colpendo # tra virgolette, ma ... perché? L'ordine è importante. I caratteri $ e # hanno più comportamenti di sovraccarico, quindi non sono a conoscenza di cosa lo stia provocando.

PS, FYI:

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

possibile duplicato di [Perplesso da un semplice 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 % 20 globale% 20 variabile% 20interpolazione & f = falso –

+0

@muistooshort: sì, hai ragione: entrambe le domande avevano la stessa risposta. – pje

risposta

7

Il problema non $, ma # è, come #... è di solito utilizzato per l'espansione variabile in corde doppie citato. Come "#{x}".

ma la cosa è è anche possibile espandere le variabili globali utilizzando direttamente #$global, e questo spiega il problema:

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

Quindi la soluzione è quello di fuggire sia#o$, in quanto questo si romperà la macchina a stati di interpolazione della stringa al di fuori del suo sforzo per interpretare il costrutto come un'interpolazione:

puts "\#$global" 
=> #$global 
puts "#\$global" 
=> #$global 

EDIT

E proprio per rendere veramente chiaro :) Il problema non è il Regexp, ma si sta cercando di espandere una variabile globale chiamata $] quando si digita "#$]":

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

Per fissare che è necessario per sfuggire qualcosa:

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

+1, ma non potresti risolvere il problema anche scambiando le posizioni dei simboli (ad esempio '[$ #]')? Non parlo correntemente con Ruby, ma secondo il documento '# è trattato come un letterale a meno che non sia seguito da' {',' $ 'o' @ '. –

+1

@AlanMoore - Sì, è vero, anche il riordino lo risolve. L'OP ha anche notato questo nel suo testo * "... l'ordine è importante ..." *. – Casper

+0

Non so cosa significhi, ma l'ordine dei personaggi in una classe di caratteri non può essere significativo (a parte quelli che hanno significati speciali come '^' e '-', cioè). –