1 $ et 1 dans Ruby

Lorsque vous utilisez des expressions régulières dans Ruby, quelle est la différence entre $ 1 et \ 1?

\ 1 est une référence arrière qui ne fonctionnera que dans le même appel de méthode sub ou gsub , par exemple:

 "foobar".sub(/foo(.*)/, '\1\1') # => "barbar" 

$ 1 est une variable globale utilisable dans le code suivant:

 if "foobar" =~ /foo(.*)/ then puts "The matching word was #{$1}" end 

Sortie:

 "The matching word was bar" # => nil 

N’oubliez pas qu’il existe une troisième option, la forme de bloc de sub . Parfois, vous en avez besoin. Supposons que vous souhaitiez remplacer un texte par l’inverse de ce texte. Vous ne pouvez pas utiliser $ 1 car il n’est pas lié assez rapidement:

 "foobar".sub(/(.*)/, $1.reverse) # WRONG: either uses a PREVIOUS value of $1, # or gives an error if $1 is unbound 

Vous ne pouvez pas non plus utiliser \1 , car la sub méthode ne fait qu’une simple substitution de texte par \1 avec le texte capturé approprié, il n’y a pas de magie ici:

 "foobar".sub(/(.*)/, '\1'.reverse) # WRONG: returns '1\' 

Donc, si vous voulez faire quelque chose de compliqué, vous devriez utiliser la forme de bloc de sub ($ 1, $ 2, $ `, $ ‘etc. seront disponibles):

 "foobar".sub(/.*/){|m| m.reverse} # => returns 'raboof' "foobar".sub(/(...)(...)/){$1.reverse + $2.reverse} # => returns 'oofrab'