【问题标题】:Cannot access function from perl module without using folder containing module identifier如果不使用包含模块标识符的文件夹,则无法从 perl 模块访问函数
【发布时间】:2016-04-16 22:57:05
【问题描述】:

我有一个名为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 

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


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

【问题讨论】:

  • 请发布确切的错误字符串。
  • 请出示您的完整模块声明。

标签: perl dbi


【解决方案1】:

您似乎对模块的名称感到困惑。是“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';

【讨论】:

  • 谢谢,尽管您的第一个建议似乎是错误的。 documentation 建议将use Exporter 'import' 作为require 的有效替代方案。您的第二个建议似乎也没有帮助,因为命名没有混淆。包是Mysql_Routines,包含它的文件夹是my_modules。这是从上面的目录调用的,因此不需要添加到我的库中。
  • 此外,我特别不想将它添加到我的库中,因为我希望这些调用它们的包和脚本能够在其他机器上工作。
  • 是您的use my_modules::Mysql_Routines 中的“my_modules::”导致了问题。它会阻止您的模块的 import() 函数被成功调用 - 这就是设置短别名的原因。如果您希望它工作,则需要将其更改为use Mysql_Routines。这意味着您需要以某种方式将“my_modules”添加到您的库搜索路径中。您可以使用use lib 或设置PERL5LIB 或使用-I 命令行选项,但您需要以某种方式进行操作。
  • 关于“这只是非标准的。”,这也不是真的。它是常用的。并且有充分的理由;它取代的旧界面(您建议的唯一界面)设计不佳。
  • 你是对的。我想我一定一直在查看旧版本的文档 - 一个不包含新版本的文档。而且我以前从未遇到过。 (/me 跑去更新几张培训课程幻灯片...)
【解决方案2】:

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

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

【讨论】:

  • 我还应该将包含模块的目录的命名更改为My_modules
猜你喜欢
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2016-03-23
  • 2021-05-12
  • 2016-02-05
  • 2015-05-25
  • 2012-01-18
  • 2018-08-01
相关资源
最近更新 更多