我有一个使用两个perl模块A.pm,B.pm的perl文件。如何从一个perl模块调用一个子例程到另一个perl模块?
但是在B.pm中,我需要调用A.pm的子程序。即使我在A.pm中使用并尝试使用它,我仍然遇到未定义的错误。
对此的任何帮助非常感谢。
我有一个使用两个perl模块A.pm,B.pm的perl文件。如何从一个perl模块调用一个子例程到另一个perl模块?
但是在B.pm中,我需要调用A.pm的子程序。即使我在A.pm中使用并尝试使用它,我仍然遇到未定义的错误。
对此的任何帮助非常感谢。
有两个元素 - 首先是找到模块。 Perl有一个'库'的路径,你可以找到:
print join ("\n", @INC);
这是它看起来的地方。它还会检查当前的工作目录,但使用运行时相对路径会有点困难 - 您需要使用FindBin
模块。
第二个元素是导入和导出子例程。默认情况下,如果你use A;
你不会导入一切到您的本地名称空间,因为......你不想意外覆盖你的内部功能之一。那种方式就是疯狂。
所以您:
use A qw (somefunction);
这将“拉”是功能和本地命名空间中定义它。这些东西的确切行为可以通过Exporter
和设置@EXPORT
和@EXPORT_OK
进行修改。
或者通过'包路径'引用它。
A::somefunction(@arguments);
这也适用于变量,虽然你将不得不范围他们our
而非my
。
感谢此解决方案。 – googytech
未定义的错误可能是因为您的B.PM无法找到A.PM。你可以尝试使用
use FindBin;
use lib "$FindBin::Bin/../lib";
或直接使用use lib "$folder containing A.pm"
另外,我并不清楚你在哪里越来越不确定。在你的perl脚本或你的B.PM模块中?
不,这会导致'不能在@ INC中找到A.pm' – ikegami
我认为你需要在B.pm文件的开头说'使用A',然后用A :: your_sub_name()调用子类。 –
发布一个演示问题的完整示例。 –
很难说你做错了什么,因为你没有向我们展示,但它可能是[为什么包A中的函数在递归调用对方时不能导入包B?](http:// stackoverflow .com/q/11521584/589924) – ikegami