/ / Perl-Hash-Syntaxfehler in der Befehlszeile - Perl, Hash

Perl-Hash-Syntaxfehler in der Befehlszeile - Perl, Hash

Als ich in der Befehlszeile wie in dem folgenden Beispiel Hash versuchte, erhalte ich Syntaxfehler. Ich habe es auch mit Fett komma versucht, aber immer noch das gleiche Ergebnis. Kann mir jemand helfen?

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.

Antworten:

2 für die Antwort № 1

Sie verwenden doppelte Anführungszeichen, um Ihren Befehl zu übergebenzu Perl. Dies bedeutet, dass die Shell zuerst alle Variablen in Ihrer Zeichenfolge interpoliert, bevor sie den Befehl an Perl übergibt. Sie können dies sehen, wenn Sie einfach Echo auf die Zeichenfolge mit doppelten Anführungszeichen und dann einfachen Anführungszeichen ausführen. Die Ausgabe von echo zeigt an, was die Shell dann an Perl weitergibt

Wenn die Shell den Text im Double verarbeitetzitiert es interpoliert die $ hash_ex. Da dies nicht in der Shell festgelegt ist, wird dies als nichts interpoliert, was Ihre print-Anweisung bedeutet, anstatt sie zu sein

print $hash_ex{a}

wird

print {a}

Sie müssen also alle Ihre Perls in einzelne Zahlen einfügen, so dass die Shell keine Variablen interpoliert und die vollständige Zeichenkette an Perl als literale Zeichenkette übergibt.


3 für die Antwort № 2

Das Problem ist, dass Ihre Shell auch Variablen ersetzt, die mit beginnen $:

# (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"};

Aus diesem Grund verwenden Sie besser einzelne Qotes für Ihre -E Streit:

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

Wenn Sie wirklich einfache Anführungszeichen benötigen (in diesem Fall nicht), können Sie das verwenden q Operator:

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

Oder Sie können versuchen, die Interpolation Ihrer Shell zu vermeiden:

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