如何在perl中转义'$'字符?

时间:2011-10-10 14:13:16

标签: perl escaping

我正在尝试执行MongoDB查询,如下所示:

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

但我得到以下错误 -

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

根据MongoDB文档,\ $ set应该可以正常工作。这可能有什么问题?

4 个答案:

答案 0 :(得分:5)

有几个问题。

  • Perl哈希以逗号分隔。它不是JSON或JavaScript。请勿使用:
  • 如果使用胖逗号(=>
  • ,则可以避免引用键名
  • 如果您使用非常奇怪的字符,情况并非如此。如果您希望密钥名称中包含$,请使用非插值字符串。

此:

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

答案 1 :(得分:3)

你可以使用简单的单引号,它在Perl中不会内插值。然后你的'$'将作为字符串的一部分传递,而不是试图为变量插值。

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

请注意,在上面的示例中,我还将字段名称周围的双引号更改为单引号。当您表示字符串文字时,在Perl中使用单引号是好的做法,而当您想要用变量的值替换时,请使用双引号。 此外,您不希望(或需要)转义'$ id'前面的'$',因为您确实希望在更新调用中替换id变量。

“qw()”运算符Paul表示同样的事情。请参阅perldoc perlop部分中的“引用和引用类操作符”。

编辑的答案反映了有关不正确哈希表示法的其他评论。

答案 2 :(得分:1)

利用Perl中不同的引用机制。

例如,引用词只是说“按字面意思对待所有内容”。我在这里使用括号作为我的分隔符,但关于qw的另一个非常酷的事情是你可以自由地为你的情况使用适当的分隔符。

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

答案 3 :(得分:1)

这与引用无关。来自perl的消息告诉你它正在找到符号$ set(所以它正确地解释了sigil)但是在范围内没有这样的符号。

可能你有'使用严格',并且未能用'my'(或'我们的')声明$ set。