/ Error de sintaxis de hash / perl en la línea de comandos - perl, hash

Error de sintaxis de hash de perl en la línea de comandos - perl, hash

Cuando probé el hash en la línea de comandos como en el siguiente ejemplo, aparece un error de sintaxis. Intenté usar una coma gorda también pero aún así el mismo resultado. ¿Alguien me puede ayudar?

perl -e "%hash_ex=(as,wdesadc,afcsdc,esvdfvzdfvfv,1,sd,34,34);print $hash_ex{"1"};"
syntax error at -e line 1, near "};"
Execution of -e aborted due to compilation errors.

perl -e "%hash_ex=("a" => 1 , "b" => 2);print $hash_ex {a};"
syntax error at -e line 1, near "};"
Execution of -e aborted due to compilation errors.

Respuestas

2 para la respuesta № 1

Está utilizando comillas dobles para pasar su comandoa Perl. Esto significará que el shell primero interpolará cualquier variable en su cadena antes de que luego pase el comando a Perl. puede ver esto si solo ejecuta echo en la cadena con comillas dobles y luego comillas simples. La salida de echo mostrará lo que la shell está pasando a Perl

Cuando el shell procesa el texto en el doble.Las cotizaciones interpola el $ hash_ex. Como esto no está configurado en el shell, esto se interpola como nada, lo que significa que su declaración de impresión en lugar de ser

print $hash_ex{a}

se convierte

print {a}

Así que necesitas envolver todo tu perl en singleqotes para que el shell no interpole ningún vars y pase la cadena completa a perl como cadena literal.


3 para la respuesta № 2

El problema es que tu Shell también sustituye variables que comienzan con $:

# (on zsh and bash)
echo "%hash_ex=(as,wdesadc,afcsdc,esvdfvzdfvfv,1,sd,34,34);print $hash_ex{"1"};"
%hash_ex=(as,wdesadc,afcsdc,esvdfvzdfvfv,1,sd,34,34);print {"1"};

Debido a esto, es mejor que uses qotes individuales para tu -E argumento:

perl -e"%hash_ex=(as,wdesadc,afcsdc,esvdfvzdfvfv,1,sd,34,34);print $hash_ex{1};"
sd

Si realmente necesita comillas simples (en este caso, no lo haga), puede usar el q operador:

perl -E"say q~some non-interpolating stringtn$_~"
some non-interpolating stringtn$_

O puede intentar evitar la interpolación de su shell:

perl -e "%hash_ex=(as,wdesadc,afcsdc,esvdfvzdfvfv,1,sd,34,34);print $hash_ex{"1"};"