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 № 1Uż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"};"