2011-10-10 165 views
1

我想执行如下一个MongoDB的查询:

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

,但我得到下面的错误 -

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

按MongoDB的文档\ $组应该工作就好了。这里有什么可能是错的?

+1

这是Perl吗? –

回答

3

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

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

请注意,在上面的例子中,我还将字段名称的双引号也改为单引号。在Perl中使用单引号是一种很好的做法,而当您想要用变量的值替换时使用双引号。 此外,您不希望(或需要)在'$ id'之前转义'$',因为您希望id变量在更新调用中被替换。

保罗显示的“qw()”操作符做同样的事情。请参阅perldoc perlop部分中的“引用和引用类运营商”。

已编辑的答案反映了有关不正确散列符号的其他意见。

1

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

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

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

因为你只会想要一个值,所以我不会使用'qw',因为它会返回一个列表。虽然在这个上下文中包含一个标量和一个标量的列表之间没有任何区别,但这是一个相当混乱的构造。普通引号或'q()'会更好的IMO。 – Quentin

5

有几个问题。

  • Perl散列用逗号分隔。它不是JSON或JavaScript。不要使用:
  • 如果您使用胖逗号,则可以避免引用键名(=>
  • 如果您使用真奇数字符,则不会出现这种情况。如果要在密钥名称中输入$,请使用非插值字符串。

此:

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

你仍然有一个冒号在那里漂浮。 –

+0

@John - 谢谢,修正。 – Quentin

1

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

也许你有'使用严格',并且未能用'my'(或'our')声明$ set。