【问题标题】:Perl issues regarding mysql:Can't locate object method "connect" and Can't use string ("") as a HASH关于 mysql 的 Perl 问题:Can't locate object method "connect" and Can't use string ("") as a HASH
【发布时间】:2015-03-11 23:35:35
【问题描述】:

我目前正在尝试运行由 Perl 脚本组成的 NERVE 疫苗开发程序,但无法使其正常运行。我已经下载并安装了所有先决条件,但每次我到达代码的 mysql 步骤时,它都会崩溃,并显示一条错误消息:无法通过包“Mysql”定位对象方法“connect”(也许你忘记加载“ Mysql”?)在 ./NERVE 第 340 行,第 5 行。我查看了代码并将“使用 mysql”更改为“使用 DBI”和“使用 DBD:mysql”,但随后出现错误:无法使用string ("") 作为 HASH ref 而“strict refs”在 /usr/local/lib/perl/5.14.2/DBI.pm 第 604 行第 5 行使用。

如果有人可以查看 mysql 部分的代码并就如何修复它给我建议以便我可以正确运行程序,我将不胜感激。我尝试向开发人员发送电子邮件但没有回复,所以我希望你们能帮助我。

下面是 NERVE 的 mysql 部分的 perl 代码。

    use mysql;
$db=Mysql->connect("$host","$database","$user","$password");
if(!$db || (!$host || !$database || !$user || !$password)){
    print "\nAttention: mysql connection parameters are missing or not correct!\n";
    print "I need you to specify: host, database, user, password;\n";
    print "You can do it now typing them right in that order and separeted only by comma;\n";
    print "For example:localhost,Pathogens,sandro,xvzhs\n";
    print "So, your Mysql connection settings are (type q to quit):";
    while (!($db && $mysql =~ /,/) & $mysql ne "q"){
        chomp($mysql = <STDIN>);
        die "Ok,let's quit this work! Call me when your mind is clearer about Mysql parameters! Bye :-)\n" if $mysql eq "q";
        ($host,$database,$user,$password) = split (',',$mysql);
        $db=Mysql->connect("$host","$database","$user","$password");
        last if($db && $mysql =~ /,/);
        print "\nMysql connection settings still not correct!\n";
        print "Remember: host, database, user, password, separeted only by comma.\n";
        print "For example:localhost,Pathogens,sandro,xvzhs\n";
        print "Please, try again:";
    }
    print "Ok, Mysql connection to \"$database\" database was successful!\n";
}

【问题讨论】:

  • 呸。 Mysql.pm has been obsolete since 1998. 您应该仔细阅读DBI documentation,因为它的界面与Mysql.pm 不同,并且您的代码需要相应地更新(即您不能只用use DBI; 替换use Mysql; 并期望它能够工作)。我将从阅读outline usage 部分开始。
  • 话虽如此,如果这是那些可怕的百万行怪物之一,也被称为“遗留代码”(颤抖),那么更新它不是一种选择,只是将您的use 语句更改为use Mysql;,大写为M。 Perl 区分大小写。
  • 是的,“使用 mysql”最初是“使用 Mysql”,但它给了我错误:无法在 @INC 中找到 Mysql.pm(@INC 包含:/usr/lib/perl5/DBD /usr/lib/perl5/DBD/mysql /usr/lib/perl5/DBI /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib /perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) 在 ./NERVE 第 339 行。开始失败——编译在 ./ 中止神经线 339。
  • 有没有我可以下载的包让 Mysql 代替 mysql 工作?我现在正在运行 Debian 7。抱歉所有问题,我对所有这些编程和 Linux 东西都是新手。
  • 神经软件最初发布于 2006 年。如果您现在真的想使用它,请向原作者询问现代版本。只是我的 2 美分。

标签: mysql perl


【解决方案1】:

错误信息是正确的。您正在尝试使用名为 的模块,但从未加载过它。改变

use mysql;

use Mysql;

使用该模块。在 cmets 中,您提到导致

Can't locate Mysql.pm in @INC 

除非您有理由相信该模块已安装,否则表明它需要安装[1]

该模块曾经是 DBD-mysql 发行版的一部分,但它已经过时了。它太古老了,几年前就从 DBD 中删除了。要获得它,您需要将您的 DBD-mysql 发行版降级到版本3.0008

这是非常糟糕的事情。脚本应该有 DBI。


cjm 积分

由于 3.0008 中的 Mysql.pm 只是在底层使用 DBI 的兼容层,您应该能够从旧的 dist 以及当前的 DBD-mysql 安装 Mysql.pm 和 Mysql/Statement.pm。

因此,如果您从上面链接的发行版中提取Mysql.pm/usr/lib/perl5/Mysql.pmMysql/Statement.pm/usr/lib/perl5/Mysql/Statement.pm,您应该有一个简单的无痛解决方案。


  1. 在较新版本的 Perl 中,错误消息已得到改进。现在的内容如下:

    Can't locate Mysql.pm in @INC (you may need to install the Mysql module)
    

【讨论】:

  • 忘了你不是在调试你自己的代码。更新了答案。
  • 实际上,由于 3.0008 中的 Mysql.pm 只是在底层使用 DBI 的兼容层,因此您应该能够从旧 dist 安装 Mysql.pm 和 Mysql/Statement.pm 以及当前 DBD-mysql。
  • 在我的回答中加入了@cjm 的评论和一些额外的细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 2021-08-21
  • 2011-06-26
相关资源
最近更新 更多