我有一个perl文件,它使用两个perl模块A.pm,B.pm。
但是在B.pm我需要调用A.pm的子程序。即使我在A.pm中使用并尝试使用它,我仍然会得到未定义的错误。
对此的任何帮助都非常感谢。
答案 0 :(得分:2)
有两个要素 - 首先是找到模块。 Perl有一个'库'你可以找到的路径:
print join ( "\n", @INC );
这是它看起来的地方。它还会检查当前的工作目录,但是使用运行时相对路径会有点困难 - 你需要使用FindBin
模块。
第二个元素是导入和导出子例程。默认情况下,如果您use A;
赢得将所有内容导入您的本地名称空间,因为......您不想意外覆盖其中一个内部功能。那种方式就是疯狂。
所以你要么:
use A qw ( somefunction );
将会进入'该函数并在本地命名空间中定义它。可以通过Exporter
并设置@EXPORT
和@EXPORT_OK
来修改这些内容的确切行为。
或者通过'包路径'来引用它。
A::somefunction(@arguments);
这也适用于变量,但您必须使用our
而不是my
来限定它们。
答案 1 :(得分:0)
未定义的错误可能是因为您的B.PM无法找到A.PM.你能尝试使用
吗?use FindBin;
use lib "$FindBin::Bin/../lib";
或直接使用use lib "$folder containing A.pm"
另外,我不清楚你在哪里未定义。在您的perl脚本或B.PM模块中?
答案 2 :(得分:0)
我只想直接从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