2012-03-18 20 views
5

Quiero usar alguna línea Perl, así:

perl -pe "$_=~s///e" 

El problema es, golpe del mantiene la expansión de la variable "$ _". Podría poner la expresión perl en comillas simples, pero eso me impediría agregar algunas variables en una secuencia de comandos.

¿Hay alguna manera de detener la expansión de la variable "$ _"?

+2

Atención más cerca: no seas ridículo. Las preguntas de programación de Shell pertenecen a stackoverflow. – tchrist

+1

No * necesita * utilizar la variable '$ _' allí. – TLP

+0

@TLP - eso fue solo un ejemplo. En el guión real, realmente * lo * necesitaba. :) – Rogach

Respuesta

11
perl -pe '$_=~s///e' 

o

perl -pe "\$_=~s///e" 
1

mezcla y combinación.

perl -pe '$_=~s///e; echo "'"$idontknowperl"'"' 

Siempre que las secciones citadas coincidan entre sí se considerará un único argumento.

+3

Bueno, sí, pero el compilador de Perl no estará contento de que haya llamado a un método/función 'echo'. :) – tchrist

5

En primer lugar: Sabe que puede usar $ENV{myvariable} para acceder a las variables de entorno, ¿no? Y que no necesita especificar $_ cuando usa m//, s/// y tr///?

Además, si quiere pasar variables a perl, hay otras maneras de hacerlo además de intentar interpolar variables de shell en su código perl.

perl -we 'my ($var1, $var2, $var3) = @ARGV;' "$MYFOO" "$BAR" "$baz" 

Si las variables de su caparazón no contienen espacios en blanco, puede prescindir de las comillas.

Ahora, si desea utilizar los conmutadores -p o -n, también hay formas de evitarlo.

perl -pwe 'BEGIN { my $var1 = shift; my $var2 = shift } #code goes here' 
    "$MYFOO" "$BAR" file1 file2 

Usando shift en una instrucción BEGIN eliminará las variables de @ARGV de modo que no son utilizados por el bucle implícita while de los -p y -n interruptores.

+1

'ENV' en perl es específicamente para variables de entorno, no para variables de shell en general. –

Cuestiones relacionadas