【问题标题】:Perl use module, keep getting Undefined subroutine &main errorPerl 使用模块,不断收到 Undefined subroutine &main 错误
【发布时间】:2013-11-12 02:36:00
【问题描述】:

我有一个 perl 模块 DB.pm,里面是这样的:

package GUI::DB;
use strict;
use DBI;
use vars qw(@ISA @EXPORT);
use Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(fun);
sub fun {
    my $dsn = "DBI:mysql:database=test";
    return $dsn;
}

然后我写了test.pl:

#!/usr/bin/perl
use strict;
use warnings;
use lib '~/Downloads/GUI'; #Here is the path of the DB.pm module.
use DB;
my $aa = fun();

我已经尝试修复它几个小时,我尝试使用评论 perl -l /path/to/file aa.pl,它没有给我任何错误,但脚本根本没有运行,我对 Perl 完全是新手,真的卡住了。 请帮帮我。

编辑:所以模块的名称是 DB.pm,文件夹的名称现在是 GUI,我在我的脚本中使用 use DB,仍然不起作用,我应该在哪里保存 DB.pm 文件?

【问题讨论】:

  • 你忘了说use HA;吗?
  • 惯例是在一个名为 GUI/DB.pm 的文件中定义一个名为 GUI::DB 的包,并使用 use GUI::DB 导入它以避免您遇到的问题。
  • 是的,应该是使用HA;但它仍然不起作用。
  • 我把文件夹名改成GUI,不能用'/'命名文件,现在给我Can't locate GUI/DB.pm in @INC (@INC contains: ~/Downloads/GUI /etc/perl ...the lib paths..
  • ~ 没有被 perl 扩展。如果您在 Unix 系统上,请改用 $ENV{HOME}。

标签: mysql perl


【解决方案1】:

Perl 不理解 ~,请参阅 How do I find a user's home directory in Perl?

你还需要给use libGUI/DB.pm所在的目录并使用GUI::DB

use lib $ENV{HOME}."/Downloads";
use GUI::DB;

【讨论】:

    【解决方案2】:

    use HA; 做了几件事。首先,它在 perl 库路径 (@INC) 中找到文件 HA.pm。其次,它调用HA::->import() 以允许HA 模块进行任何它想要的初始化/导出;这依赖于与其文件名匹配的模块包。如果没有,这个初始化会被悄悄地跳过(即使方法不存在,对import 方法的方法调用也不会产生错误)。

    所以在你想要的包上显式调用 import,或者使包名与文件名匹配。

    【讨论】:

    • 我将模块的名称更改为 DB.pm,并在我的脚本中使用了使用 DB(也是 GUI::DB),我还尝试了我的 $aa= DB->fun();still不起作用,我应该将 DB.pm 文件保存在哪里?
    • 通常perl会在当前目录中寻找模块,除了其他地方。 perl -wle'print for @INC' 是否将 . 显示为行之一?如果是这样,请将 DB.pm 放在 ./GUI/
    猜你喜欢
    • 2013-12-13
    • 1970-01-01
    • 2021-04-23
    • 2014-03-04
    • 2021-03-05
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多