5 votes

Barres obliques inversées dans gsub (échappement et référencement arrière)

Considérez l'extrait suivant :

puts 'hello'.gsub(/.+/, '\0 \\0 \\\0 \\\\0')

Cela imprime ( vu sur ideone.com ) :

hello hello \0 \0

C'était très surprenant, car je m'attendais plutôt à voir quelque chose comme ça :

hello \0 \hello \\0

Mon argument est que \ est un caractère d'échappement, donc vous écrivez \\ pour obtenir un backslash littéral, donc \\0 est un backslash littéral \ suivi par 0 etc. Évidemment, ce n'est pas ainsi que gsub l'interprète, alors quelqu'un peut-il expliquer ce qui se passe ?

Et que dois-je faire pour obtenir le remplacement que je souhaite ci-dessus ?

7voto

Konstantin Haase Points 12089

L'échappement est limité lorsqu'on utilise des guillemets simples plutôt que des guillemets doubles :

puts 'sinlge\nquote'
puts "double\nquote"

"\0" est le caractère nul (utilisé par exemple en C pour déterminer la fin d'une chaîne de caractères), alors que '\0' es "\\0" par conséquent, les deux 'hello'.gsub(/.+/, '\0') y 'hello'.gsub(/.+/, "\\0") retourner "hello" mais 'hello'.gsub(/.+/, "\0") renvoie à "\000" . Maintenant 'hello'.gsub(/.+/, '\\0') en retournant sur 'hello' ruby essaie de gérer le fait que les programmeurs ne gardent pas à l'esprit la différence entre les guillemets simples et doubles. En fait, cela n'a rien à voir avec gsub : '\0' == "\\0" y '\\0' == "\\0" . En suivant cette logique, quoi que vous puissiez en penser, voici comment ruby voit les autres chaînes : les deux '\\\0' y '\\\\0' égal "\\\\0" qui (une fois imprimé) donne \\0 . Comme gsub utilise \x pour insérer le numéro de correspondance x, il faut un moyen d'échapper \x qui est \\x ou dans sa représentation sous forme de chaîne : "\\\\x" .

Par conséquent, la ligne

puts 'hello'.gsub(/.+/, "\\0 \\\\0 \\\\\\0 \\\\\\\\0")

entraîne en effet

hello \0 \hello \\0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X