2009-07-01 14 views
9

¿Cuál es la diferencia entre hacer \ 1 en lugar de $ 1 si hay alguno, o son intercambiables en todas las situaciones?

Ejemplo:

s/([a-z]+),afklol/$1,bck/; 
#against 
s/([a-z]+),afklol/\1,bck/; 

Ambos dan el mismo resultado, pero ¿hay alguna diferencia?

Respuesta

16

Directamente desde perldoc perlre:

de advertencia en \ 1 vs $ 1

Algunas personas se acercan demasiado acostumbrados a escribir cosas como:

$pattern =~ s/(\W)/\\\1/g; 

Esto es de derechos adquiridos por el lado derecho de un sustituto para evitar sorprender a los adictos sed , pero es un hábito sucio obtener en. Esto se debe a que en PerlThink, , el lado derecho de una "s ///" es una cadena de comillas dobles . "\ 1" en el cadena doble entre comillas significa control-A. El significado habitual de Unix es de "\ 1" para kludged para "s ///". Sin embargo, si te acostumbras a haciendo eso, te metes en problema si luego agregas un modificador "/ e" .

s/(\d+)/ \1 + 1 /eg;  # causes warning under -w 

O si se intenta hacer

s/(\d+)/\1000/; 

No se puede eliminar la ambigüedad que al decir "{1} 000", mientras que se puede arreglar con "$ {1} 000" . La operación de interpolación no debe confundirse con la operación de emparejar una referencia inversa .

Sin duda se refieren a dos cosas diferentes en el lado izquierdo de la "s ///".

1

Dan el mismo resultado, pero $ 1 conserva su valor mientras \ 1 no. Prueba esto:

s/([a-z]+),afklol/$1,bck/; 
print "\$1 is $1\n"; 
#against 
s/([a-z]+),afklol/\1,bck/; 
print "\\1 is \1\n"; 
+1

Eso es porque fuera de un m // o s /// \ 1 no es una referencia retrospectiva. (Lo que realmente es depende del contexto.) –

9

solamente utilizo \1 en las raras ocasiones en las que necesito el partido para incluir una repetición de una parte anterior del patrón. p.ej.

/(foo|bar)baz\1/ 

Esto coincidiría con "foobazfoo" o "barbazbar", pero no "foobazbar". Usted no puede utilizar $1 allí.

En cualquier otra circunstancia utilizo $1 y kin, porque hay demasiadas trampas para usar la otra notación. Ver perlre para todos los detalles sangrientos.

+1

Eso es lo que me preguntaba cuando vi la pregunta: ¿pueden ambos usarse como referencia retrospectiva? – Axeman

Cuestiones relacionadas