Как избежать символа '$' в Perl? - PullRequest
1 голос
/ 10 октября 2011

Я пытаюсь выполнить запрос MongoDB, как показано ниже:

$Collection1->update({"_id":\$id}, { \$set: {"Title":$title} }, false );  

Но я получаю ошибку ниже -

Global symbol "$set" requires explicit package name at file.pl line xx.

Согласно документации MongoDB, предполагается, что \ $ set будет работатьпросто хорошо.Что здесь может быть не так?

Ответы [ 4 ]

5 голосов
/ 10 октября 2011

Есть несколько проблем.

  • Хеш Perl разделяется запятой.Это не JSON или JavaScript.Не используйте :.
  • Вы можете избежать цитирования имен клавиш, если используете толстую запятую (=>)
  • Это не так, если вы используете действительно нечетные символы,Используйте неинтерполированную строку, если вы хотите $ в имени ключа.

This:

$Collection1->update({"_id" => \$id}, { '$set' => { Title => $title} }, false );  
3 голосов
/ 10 октября 2011

Вы можете использовать простые одинарные кавычки, которые в Perl НЕ будут интерполировать значение внутри.Тогда ваш '$' будет передан как просто часть строки вместо того, чтобы пытаться интерполировать значение для переменной.

$Collection1->update({'_id' => $id}, { '$set' => {'Title' => $title} }, false );  

Обратите внимание, что в приведенном выше примере я также изменил ваши двойные кавычки вокруг имен полей набыть одинарные кавычки также.В Perl рекомендуется использовать одинарные кавычки, когда вы имеете в виду строковый литерал, и двойные кавычки, когда вы хотите заменить значение переменной.Кроме того, вы не хотите (или не должны) экранировать '$' перед '$ id', поскольку вы хотите, чтобы переменная id заменялась в вызове обновления.

в "qw() "оператор Пол показал то же самое.См. «Цитировать и цитировать операторов» в разделе perldoc perlop.

отредактированный ответ, чтобы отразить другие комментарии о неправильных хэш-нотациях.

1 голос
/ 10 октября 2011

Это не имеет ничего общего с цитированием.Сообщение от perl говорит вам, что он находит набор символов $ (так что он правильно интерпретирует сигилу), но такого символа нет в области видимости.

Возможно, вы включили 'Использовать строгий' и не смогли объявить $ set с помощью 'my' (или 'our').

1 голос
/ 10 октября 2011

Воспользуйтесь преимуществами различных механизмов цитирования в Perl.

Например, цитирует слова просто говорит "относиться ко всему внутри буквально".Я использовал здесь круглые скобки в качестве разделителей, но еще одна очень крутая вещь в qw - вы можете использовать соответствующие разделители для вашей ситуации.

$Collection1->update({"_id":\$id}, { qw($set): {"Title":$title} }, false );  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...