【问题标题】:How to call a subroutine from one perl module to another perl module?如何从一个 perl 模块调用一个子程序到另一个 perl 模块?
【发布时间】:2018-07-18 15:59:34
【问题描述】:

我有一个使用两个 perl 模块 A.pm 和 B.pm 的 perl 文件。

但是在 B.pm 中我需要调用 A.pm 的子程序。即使我在 A.pm 中使用并尝试使用它,我仍然会收到未定义的错误。

非常感谢您对此的任何帮助。

【问题讨论】:

标签: perl perl-module


【解决方案1】:

有两个元素 - 首先是找到模块。 Perl 有一个“库”路径,您可以通过以下方式找到它:

print join ( "\n", @INC ); 

这是它看起来的地方。它还会检查当前的工作目录,但使用运行时相对路径会有点困难——您需要使用 FindBin 模块。

第二个元素是导入和导出子程序。默认情况下,如果您 use A;不会将所有内容导入本地名称空间,因为...您不想意外覆盖您的内部函数之一。那就是疯狂。

所以你要么:

use A qw ( somefunction ); 

这将“拉入”该函数并在您的本地命名空间中定义它。这些东西的确切行为可以通过Exporter 和设置@EXPORT@EXPORT_OK 进行修改。

或者通过“包路径”引用它。

A::somefunction(@arguments);

这也适用于变量,尽管您必须使用our 而不是my 来限定它们。

【讨论】:

  • 这对我不起作用。您能否提供一个使用 use A qw ( somefunction ); 的完整端到端示例,并解释新手 Perl 用户如何调用该函数而不会遇到语法错误和 undefined function 错误?
  • 如果它适用于 OP,但不适用于您,我建议您的方案在细节上有所不同。因此,您最好的选择是问另一个问题(也许参考这个问题,解释有什么不同)
  • 引用包路径对我有用。谢谢!
【解决方案2】:

未定义的错误可能是因为您的 B.PM 无法找到 A.PM。你可以尝试使用

use FindBin;
use lib "$FindBin::Bin/../lib";

或直接使用use lib "$folder containing A.pm"

另外,我不清楚你在哪里不确定。在您的 perl 脚本或 B.PM 模块中?

【讨论】:

  • 不,这将导致Can't locate A.pm in @INC
【解决方案3】:

我只是想直接从 perl 模块 (File::Glob::Windows) 调用子 (glob) 而不导入子 glob,因为它与 Moose 冲突并出现错误“使用访问器覆盖本地定义的函数”。

这为我指明了正确的方向:https://www.perlmonks.org/?node_id=623567

use File::Glob::Windows qw();   # Hide everything

...

File::Glob::Windows::glob(...); # Access sub explicitly

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    相关资源
    最近更新 更多