2011-07-13 9 views
9

¿Qué significan los valores $ 1, $ 2, $ ', $ `en Ruby?¿Cuáles son las variables globales numeradas de Ruby?

+0

Creo que significan que el desarrollador de Ruby cree que está siendo inteligente al elegir nombres de variables crípticos. – aroth

+5

Tendrás que culpar a lwall por ellos, en realidad; Ruby los importó al por mayor de Perl. – geekosaur

+2

@geekosaur, no necesariamente, por lo que recuerdo, Larry Wall los importó de awk. El rubyista podría usar $ POSTMATCH por $ ', $ PREMATCH por $ 'luego de requerir" English ". – Arie

Respuesta

17

Son capturas de la última coincidencia de patrones (al igual que en Perl; Rubí inicialmente levantó una gran cantidad de sintaxis de Perl, aunque es en gran parte ya lo he superado :). $1, $2, etc. refieren a capturas paréntesis dentro de una expresión regular: dado /a(.)b(.)c/, $1 será el carácter entre a y b y $2 el carácter entre b y c. $` y $' significan las cadenas antes y después de la cadena que coincidió con la expresión regular completa (que a su vez está en $&), respectivamente.

En realidad, esto tiene algún sentido, aunque solo sea históricamente; puede encontrarlo en perldoc perlvar, que generalmente hace un buen trabajo al documentar los mnemotécnicos y el historial de las variables de Perl, y sobre todo se aplica a los globales en Ruby. Las capturas numeradas son reemplazos para la sintaxis de regex de retrospectiva de captura (\1, \2, etc.); Perl cambió de lo primero a lo último en alguna parte de las versiones 3.x, porque el uso de la sintaxis de retroreferencia fuera de la expresión regular complicó demasiado el análisis. (En el momento Perl 5 dio la vuelta, el analizador había sido suficientemente reescrito que la sintaxis estaba nuevamente disponible, y reutilizado rápidamente para referencias/"punteros". Ruby optó por usar una cita de nombre :, que está más cerca de Lisp y Estilo Smalltalk, dado que Ruby comenzó como un Perl-like con estilo O Smalltalk, esto tenía más sentido lingüístico.) Lo mismo se aplica a $&, que en la sintaxis histórica de regex es simplemente & (pero no puede usar eso fuera del reemplazo parte de una sustitución, por lo que se convirtió en una variable $& en su lugar). $` y $' son "cursi": "cita inversa" y "cita futura" de la cadena coincidente.

7

las no numeradas se listan aquí:

http://www.zenspider.com/Languages/Ruby/QuickRef.html#19

$1, $2 ... $N se refieren a partidos en un grupo de captura de expresiones regulares.

Así:

"ab:cd" =~ /([a-z]+):([a-z]+)/ 

cedería

$1 = "ab" 
$2 = "cd" 
+0

Parece que te perdiste un corchete de apertura ([) en la expresión después de dos puntos. Debería ser "ab: cd" = ~/([a-z] +): ([a-z] +) / –

Cuestiones relacionadas