简体   繁体   English

从Perl连接到MongoDB时的编译错误

[英]Compilation errors when connecting to MongoDB from Perl

I'm trying to run the simple "MongoDB:Tutorial" tutorial: 我正在尝试运行简单的“MongoDB:Tutorial”教程:

http://search.cpan.org/dist/MongoDB/lib/MongoDB/Tutorial.pod http://search.cpan.org/dist/MongoDB/lib/MongoDB/Tutorial.pod

My goal is to connect to a MongoDB database from a Perl script. 我的目标是从Perl脚本连接到MongoDB数据库。 I've installed MongoDB using cpanm: 我用cpanm安装了MongoDB:

$ sudo cpanm MongoDB
MongoDB is up to date. (0.501.1)

I created a simple Perl script called loadRaw.pl : 我创建了一个名为loadRaw.pl的简单Perl脚本:

use strict;
use warnings;

use MongoDB;
use MongoDB::Connection;
use MongoDB::OID;

print "hello\n";

When I try to run the script, I get a bunch of errors: 当我尝试运行脚本时,我收到一堆错误:

$ perl ./loadRaw.pl
String found where operator expected at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 271, near "confess "cannot set fields after querying""
    (Do you need to predeclare confess?)
String found where operator expected at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 273, near "confess 'not a hash reference'"
    (Do you need to predeclare confess?)
String found where operator expected at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 294, near "confess "cannot set sort after querying""
    (Do you need to predeclare confess?)
String found where operator expected at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 296, near "confess 'not a hash reference'"
    (Do you need to predeclare confess?)
String found where operator expected at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 317, near "confess "cannot set limit after querying""
    (Do you need to predeclare confess?)
String found where operator expected at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 343, near "confess "Cannot set tailable state""
    (Do you need to predeclare confess?)
String found where operator expected at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 366, near "confess "cannot set skip after querying""
    (Do you need to predeclare confess?)
String found where operator expected at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 390, near "confess "cannot set snapshot after querying""
    (Do you need to predeclare confess?)
String found where operator expected at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 408, near "confess "cannot set hint after querying""
    (Do you need to predeclare confess?)
String found where operator expected at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 410, near "confess 'not a hash reference'"
    (Do you need to predeclare confess?)
syntax error at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 90, near "has started_iterating"
syntax error at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 271, near "confess "cannot set fields after querying""
syntax error at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 294, near "confess "cannot set sort after querying""
syntax error at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 317, near "confess "cannot set limit after querying""
syntax error at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 343, near "confess "Cannot set tailable state""
syntax error at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 366, near "confess "cannot set skip after querying""
syntax error at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 390, near "confess "cannot set snapshot after querying""
syntax error at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 408, near "confess "cannot set hint after querying""
BEGIN not safe after errors--compilation aborted at /usr/local/lib/perl/5.10.1/MongoDB/Cursor.pm line 564.
Compilation failed in require at /usr/local/lib/perl/5.10.1/MongoDB/Connection.pm line 26.
BEGIN failed--compilation aborted at /usr/local/lib/perl/5.10.1/MongoDB/Connection.pm line 26.
Compilation failed in require at /usr/local/lib/perl/5.10.1/MongoDB.pm line 30.
BEGIN failed--compilation aborted at /usr/local/lib/perl/5.10.1/MongoDB.pm line 30.
Compilation failed in require at ./loadRaw.pl line 7.
BEGIN failed--compilation aborted at ./loadRaw.pl line 7.

It seems like the MongoDB Perl module (specifically, the Cursor.pm file) has some syntax errors. 看起来像MongoDB Perl模块(特别是Cursor.pm文件)有一些语法错误。 The first batch of problems (those related to the confess keyword) are solved if I add the line use Carp; 如果我添加行use Carp;第一批问题(与confess关键字相关的问题)就解决了use Carp; to the top of Cursor.pm . Cursor.pm的顶部。 However, I don't think I should have to do this, and instead I'm doing something else incorrectly. 但是,我认为我不应该这样做,而是我正在做其他错误的事情。 Also, the second batch of errors (those related to the has keyword) are not solved by including Carp . 此外,第二批错误(与has关键字相关的错误)不能通过包含Carp来解决。

Has anyone else experienced this? 还有其他人经历过这个吗? Any ideas? 有任何想法吗?

I never found out exactly what was going wrong, but it was surely unique to my system and my Perl configuration. 我从来没有发现到底出了什么问题,但它确实是我的系统和我的Perl配置所独有的。 Since others were able to execute the provided code without problem, I tried executing the code using Perlbrew (as suggested by friedo): 由于其他人能够毫无问题地执行提供的代码,我尝试使用Perlbrew执行代码(由friedo建议):

$ perlbrew install perl-5.16.0
(Output not shown)
$ perlbrew switch perl-5.16.0
(Output not shown)
$ perlbrew install-cpanm
(Output not shown)
$ /home/sthomas/perl5/perlbrew/bin/cpanm MongoDB
(Output not shown)
$ perlbrew exec perl ./loadRaw.pl
perl-5.16.0
==========
hello

Since it works fine with a Perlbrew installation, the problem is not with MongoDB or my sample code; 由于它在Perlbrew安装中运行良好,因此问题不在于MongoDB或我的示例代码; it must be some weird quirk of my Perl environment. 它必须是我的Perl环境的一些奇怪的怪癖。 I guess I'll try a fresh install of Perl and all my required modules and see if that works. 我想我会尝试全新安装Perl和我所需的所有模块,看看是否有效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM