如果不使用包含模块标识符的文件夹,则无法从 perl 模块访问函数
Cannot access function from perl module without using folder containing module identifier
我有一个名为 Mysql_Routines
的 perl
模块,其中包含我使用 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
即可解决问题。使用此解决方案,不需要像建议的那样更新库搜索路径。
我有一个名为 Mysql_Routines
的 perl
模块,其中包含我使用 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
即可解决问题。使用此解决方案,不需要像建议的那样更新库搜索路径。