2014-12-21 2 views
1

Когда я пробовал хэш в командной строке, как в приведенном ниже примере, я получаю синтаксическую ошибку. Я также пытался использовать жирную запятую, но все тот же результат. Кто-нибудь может мне помочь?perl hash синтаксическая ошибка в командной строке

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. 
+2

Попробуйте использовать одинарные кавычки, чтобы обернуть вашу команду Perl. С вами или цитатой ваша система будет пытаться интерполировать переменные перед переходом на Perl. Использование одинарных кавычек предотвратит это, и вся команда будет передана perl –

ответ

2

Вы используете двойные кавычки, чтобы передать свою команду на Perl. Это будет означать, что оболочка сначала будет интерполировать любые переменные в вашей строке, а затем передать команду Perl. вы можете увидеть это, если вы просто запустите эхо в строке с двойными кавычками, а затем одинарные кавычки. Выход из эха будет показывать, что оболочка затем переходит к Perl

Когда оболочка обрабатывает текст в двойных кавычках, он интерполирует $ hash_ex. Поскольку это не установлено в оболочке это получает интерполированную как ничто, которое означает, что ваш оператор печати вместо того, чтобы быть

print $hash_ex{a} 

становится

print {a} 

Так что вам нужно, чтобы обернуть весь ваш Perl в singleqotes, так что оболочка не интерполирует любые vars и передает полную строку в perl как буквальную строку.

3

проблема заключается в том, что ваш Shell также заменяет переменные, начинающиеся с $:

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

Из-за этого, вы будете лучше использовать одинарные qotes для -E аргумента:

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

если вы на самом деле нужны одинарные кавычки (в этом случае вы этого не делаете), вы можете использовать оператора q:

perl -E'say q~some non-interpolating string\t\n$_~' 
some non-interpolating string\t\n$_ 

Или вы можете попытаться избежать интерполяционный вашей оболочки:

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

 Смежные вопросы

  • Нет связанных вопросов^_^