如何从一个 perl 模块调用子程序到另一个 perl 模块?

How to call a subroutine from one perl module to another perl module?

我有一个 perl 文件,它使用了两个 perl 模块 A.pm,B.pm。

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

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

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

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

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

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

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

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

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

第二个要素是子程序的导入导出。默认情况下,如果你 use A; 不会 将所有内容导入你的本地名称 space 因为......你不想不小心覆盖你的其中一个内部功能。那就是疯狂。

所以你要么:

use A qw ( somefunction ); 

这将 'pull in' 该功能并在您的本地名称中定义它 space。这些东西的确切行为可以通过 Exporter 和设置 @EXPORT@EXPORT_OK 进行修改。

或通过'package path'引用。

A::somefunction(@arguments);

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

我只是想直接从 perl 模块 (File::Glob::Windows) 调用一个 sub (glob),而不导入 sub glob,因为它与 Moose 发生冲突并出现错误 "overwriting a locally defined function with an accessor".

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

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

...

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