在perl中使用FindBin时导入库子例程

时间:2010-08-30 14:18:30

标签: perl export

修改 对不起,这是我更新的问题。

我在perl脚本中使用FindBin,如下所示:

use FindBin qw($Bin);
use lib "$Bin/../lib";
use multi_lib qw(say_hello_world);

这有效:

multi_lib::say_hello_world();

但这不是:

say_hello_world();

编辑2

这就是multi_lib.pm的样子:

package multi_lib;

use strict;
use warnings;
use 5.010;

require Exporter;
my @ISA = qw(Exporter); # removing `my` causes an error!
my @EXPORT_OK = qw(say_hello_world); # removing `my` causes an error!

sub say_hello_world {
 say "hello world!";
}

P.S。 我不知道@ISA代表什么,如果添加my就行了......我跟着Exporter的preldoc。

编辑3 我想我是在@EXPORT_OK之前移动use strict来解决它的。我习惯将use strict放在脚本的开头,但我想这不是去这里的方法(?)。无论如何,这有效:

use Exporter 'import';
@EXPORT_OK = qw(say_hello_world);
use strict;
...

我仍然会理解一些关于这里到底发生了什么的解释以及导出子程序的推荐方法(就像我做的那样?)。

3 个答案:

答案 0 :(得分:4)

你做不到。 lib的import()例程修改@INC而不是尝试导出任何东西。 但无论如何,lib.pm中没有适合外部使用的函数。你真的想要完成什么?

更新了有关更新问题的答案:

不,你不能在@EXPORT_OK上使用my();它需要全局可见,因此Exporter可以使用它。 请改为our @EXPORT_OK;。 @ISA也是如此;包变量@ISA控制继承,词法@ISA什么都不做。不过,我不喜欢从Exporter继承;你只需导入导出器的导入例程就可以了(除了非常旧的导出器):

use Exporter 5.57 'import';

你得到的错误提示你添加my()是因为你指定了use strict;(除其他外,要求正确声明变量,除非它们是由包名或特殊全局变量限定的包变量)。 my()等价于my(),它将变量声明为包变量而不是lexicals,因此可以从声明它们的作用域之外访问它们。最好用我们的()正确声明它们,而不是将它们移到use strict;之上以解决错误。

答案 1 :(得分:0)

这不是图书馆工作的方式。您需要设置库位置,然后从其中加载包含所需子例程的模块(.pm)。

答案 2 :(得分:0)

  

我想提出具体的意见   子程序(又名say_hello_world)来自   lib,但这不起作用:

use lib "$Bin/../lib" qw(say_hello_world);

use lib只是指向文件所在的目录,您还需要指定文件。如果您的子例程位于文件Example.pm中,那么您需要

use Example qw(say_hello_world);

另请注意,FindBin部分需要位于BEGIN块内:

BEGIN {
    use FindBin qw($Bin);
    use lib "$Bin/../lib";
};
use Example qw(say_hello_world);