如果不使用包含模块标识符的文件夹,则无法从 perl 模块访问函数

Cannot access function from perl module without using folder containing module identifier

我有一个名为 Mysql_Routinesperl 模块,其中包含我使用 DBI 操作 mysql 数据的各种函数。我将这些函数导出如下:

package Mysql_Routines;

use DBI;
use strict;
use warnings;
use Data::Dumper;

use Exporter qw(import);
our @EXPORT_OK = qw(connect_to insert_row get_rows);

这些是使用以下代码从其他脚本和模块访问的:

use my_modules::Mysql_Routines qw (connect_to insert_row get_rows);

这似乎都是标准做法,如 Perl Maven 中所述。但是,我只能通过使用模块标识符来调用这些函数,否则我会收到一个错误,指出它是一个未定义的子例程。例如:

my $dbh = Mysql_Routines::connect_to('./config/mysql-local.conf');

有效。

my $dbh = connect_to('./config/mysql-local.conf');

抛出以下错误:

Undefined subroutine &main::connect_to called 

这显然不是什么大问题,尽管我想了解为什么会发生这种情况,因为我似乎遵循了创建包含函数的模块的正确指南。


请参阅下面我的解决方案。包声明应该包含顶级目录。愚蠢的错误。

您似乎对模块的名称感到困惑。是 "Mysql_Routines" 还是 "my_modules::Mysql_Routines"?我怀疑您希望它被称为 "Mysql_Routines",在这种情况下您的 use my_modules::Mysql_Routines 是相当不寻常的。为什么你不就 use Mysql_Routines?

我想答案是您的模块位于一个名为 "my_modules" 的目录中。在这种情况下,正确的方法是将该目录添加到您的库搜索路径中。您可以使用如下代码:

use lib 'my_modules';
use Mysql_Routines';

我发现问题是在模块的包声明中我没有包含顶级目录。

package Mysql_Routines更改为package my_modules::Mysql_Routines即可解决问题。使用此解决方案,不需要像建议的那样更新库搜索路径。