2015-06-23 49 views
0

我有一个使用两个perl模块A.pm,B.pm的perl文件。如何从一个perl模块调用一个子例程到另一个perl模块?

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

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

+0

我认为你需要在B.pm文件的开头说'使用A',然后用A :: your_sub_name()调用子类。 –

+5

发布一个演示问题的完整示例。 –

+0

很难说你做错了什么,因为你没有向我们展示,但它可能是[为什么包A中的函数在递归调用对方时不能导入包B?](http:// stackoverflow .com/q/11521584/589924) – ikegami

回答

2

有两个元素 - 首先是找到模块。 Perl有一个'库'的路径,你可以找到:

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

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

第二个元素是导入和导出子例程。默认情况下,如果你use A;不会导入一切到您的本地名称空间,因为......你不想意外覆盖你的内部功能之一。那种方式就是疯狂。

所以您:

use A qw (somefunction); 

这将“拉”是功能和本地命名空间中定义它。这些东西的确切行为可以通过Exporter和设置@EXPORT@EXPORT_OK进行修改。

或者通过'包路径'引用它。

A::somefunction(@arguments); 

这也适用于变量,虽然你将不得不范围他们our而非my

+0

感谢此解决方案。 – googytech

0

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

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

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

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

+0

不,这会导致'不能在@ INC中找到A.pm' – ikegami

相关问题