2009-10-27 9 views

risposta

13

Non utilizzare più metodi: mantenerlo semplice.

Esci dal #, dal backslash e dalla doppia quota.

irb(main):001:0> foo = "`[email protected]\#$%^&*()_-+={}|[]\\:\";'<>?,./" 
=> "`[email protected]\#$%^&*()_-+={}|[]\\:\";'<>?,./" 

Oppure, se non si vuole sfuggire al # (il carattere di sostituzione per le variabili in stringhe tra doppi apici), utilizzare e la fuga apici invece:

irb(main):002:0> foo = '`[email protected]#$%^&*()_-+={}|[]\\:";\'<>?,./' 
=> "`[email protected]\#$%^&*()_-+={}|[]\\:\";'<>?,./" 

% q è grande per molte altre stringhe che non contengono ogni carattere di punteggiatura ASCII. :)

%q(text without parens) 
%q{text without braces} 
%Q[text without brackets with #{foo} substitution] 

Edit: Evidentemente è possibile utilizzare parentesi bilanciate all'interno% q() con successo pure, ma vorrei pensare che è un po 'pericoloso dal punto di vista di manutenzione, in quanto non c'è la semantica là implicare che sei sempre andando a bilanciare necessariamente i tuoi paren in una stringa.

+1

In realtà, '% q()' funziona bene anche se il testo interno ha parentesi - purché le parentesi interne siano bilanciate: 'bal =% q (pippo (()))' – Telemachus

+0

Non c'è bisogno di scappare * qualsiasi cosa *. '% q {\' ~! @ # $%^& *() _- + = {} | [] \: "; '<>?,. /}' funziona bene. – Borodin

0

La prima cosa che mi piacerebbe di solito penso sarebbe una % q Direttiva - ma dal momento che sembra che tu stia usando tutti i segni di punteggiatura che normalmente utilizzi per delimitarne uno, non riesco a pensare a un modo semplice per farlo funzionare qui.

La seconda cosa che mi piacerebbe pensare di sarebbe un heredoc:

mystring = <<END 
`[email protected]#$%^&*()_-+={}|[]\:";'<>?,./ 
END 

che rompe dopo la barra rovesciata, però.

Quindi la mia terza risposta, goffo ma la cosa migliore che posso pensare con due soli minuti di pensiero, sarebbe quella di sostituire qualcosa di innocuo per i personaggi 'problema' e poi sostituirlo dopo la cessione:

mystring = '`[email protected]#$%^&*()_-+={}|[]\:"; <>?,./'.tr(" ","'") 

Non mi piace, ma funziona.

+1

Si può usare '% q' qui - anche se lui sta usando la punteggiatura. – Telemachus

+0

Sì, hai ragione. Non ho nemmeno pensato di provare ciò che hai provato. Ben fatto. – SFEley

7

In primo luogo, a meno che io sono pazzo %q()fa lavoro qui, perfettamente, dal momento che le parentesi interne sono bilanciati:

>> weird = %q(`[email protected]#$%^&*()_-+={}|[]\:";'<>?,./) 
=> "`[email protected]\#$%^&*()_-+={}|[]\\:";'<>?,./" 
>> puts weird 
`[email protected]#$%^&*()_-+={}|[]\:";'<>?,./ 

Come nota a margine: quando si usa %q, si ha sempre l'opzione nucleare di usare spazi come delimitatore. Questo è fallo e ufficialmente una cattiva idea, ma funziona.

Ancora una volta, io non lo farei, ma solo per vedere ...

>> weird = %q `[email protected]#$%^&*()_-+={}|[]\:";'<>?,./ 
=> "`[email protected]\#$%^&*()_-+={}|[]\\:";'<>?,./" 
+0

+1 perché hai ragione! Avrei giurato che è fallito quando l'ho provato! – cwninja

Problemi correlati