logo - $ 1 y / 1 en Ruby
hbase (2)
/ 1 es una referencia inversa que solo funcionará en la misma llamada al método sub
o gsub
, por ejemplo:
"foobar".sub(/foo(.*)/, ''/1/1'') # => "barbar"
$ 1 es una variable global que se puede usar en códigos posteriores:
if "foobar" =~ /foo(.*)/ then
puts "The matching word was #{$1}"
end
Salida:
"The matching word was bar"
# => nil
Al usar expresiones regulares en Ruby, ¿cuál es la diferencia entre $ 1 y / 1?
Tenga en cuenta que hay una tercera opción, la forma de bloque de sub
. A veces lo necesitas. Digamos que quiere reemplazar algún texto con el reverso de ese texto. No puede usar $ 1 porque no está vinculado lo suficientemente rápido:
"foobar".sub(/(.*)/, $1.reverse) # WRONG: either uses a PREVIOUS value of $1,
# or gives an error if $1 is unbound
Tampoco puede usar /1
, porque el sub
simplemente hace una simple sustitución de texto de /1
con el texto capturado apropiado, no hay magia teniendo lugar aquí:
"foobar".sub(/(.*)/, ''/1''.reverse) # WRONG: returns ''1/'
Entonces, si desea hacer algo sofisticado, debe usar la forma de bloque de sub
($ 1, $ 2, $ `, $ '', etc. estarán disponibles):
"foobar".sub(/.*/){|m| m.reverse} # => returns ''raboof''
"foobar".sub(/(...)(...)/){$1.reverse + $2.reverse} # => returns ''oofrab''