如何从一个 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
我有一个 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