/ / perl hash syntax error w linii poleceń - perl, hash

błąd składni polecenia perl w linii poleceń - perl, hash

Kiedy próbowałem mieszania w wierszu poleceń, jak w poniższym przykładzie, otrzymuję błąd składni. Próbowałem również używać przecinka, ale wciąż ten sam wynik. Czy ktoś może mi pomóc?

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.

Odpowiedzi:

2 dla odpowiedzi № 1

Używasz podwójnych cudzysłowów do przekazania poleceniado Perla. Oznacza to, że powłoka najpierw interpoluje dowolne zmienne w łańcuchu, zanim przekaże komendę Perlowi. możesz to zobaczyć, jeśli uruchomisz echo na łańcuchu z podwójnymi cudzysłowami, a następnie pojedynczymi cudzysłowami. Wyjście z echa pokaże, co powłoka przechodzi do Perla

Gdy powłoka przetwarza tekst w doublecytuje to interpoluje $ hash_ex. Ponieważ nie jest to ustawione w powłoce, zostaje to interpolowane jako nic, co oznacza, że ​​twoja instrukcja wydruku jest

print $hash_ex{a}

staje się

print {a}

Musisz więc zawinąć cały perl w pojedyncze cytaty, aby powłoka nie interpolowała żadnych zmiennych i przekazywała cały ciąg do perla jako ciąg literalny.


3 dla odpowiedzi № 2

problem polega na tym, że twoja powłoka również zastępuje zmienne zaczynające się od $:

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

Z tego powodu lepiej użyjesz pojedynczych qotes dla swojego -E argument:

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

jeśli naprawdę potrzebujesz pojedynczych cudzysłowów (w tym przypadku nie), możesz użyć q operator:

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

Możesz też spróbować uniknąć interpolacji powłoki:

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