繁体   English   中英

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

[英]import a library subroutine while using FindBin in perl

编辑很抱歉给您带来混乱,这是我更新的问题。

我在我的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!";
}

ps我不知道@ISA代表什么,如果添加my是可以的...我遵循了Exporter的preldoc。

编辑3我认为我通过在use strict之前移动@EXPORT_OK解决了它。 我习惯在脚本的开头放上use strict权限,但是我想这不是这里的方法(?)。 无论如何,这可行:

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

我仍然希望对这里到底发生了什么以及导出子例程的推荐方式(像我一样)进行一些解释。

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

已更新问题的更新答案:

不,您不能在@EXPORT_OK上使用my(); 它必须是全局可见的,以便Exporter可以使用它。 our @EXPORT_OK; 代替。 @ISA也是如此; 包变量@ISA控制继承,词汇@ISA则不执行任何操作。 不过,我更喜欢不继承Exporter。 您只需导入Exporter的导入例程即可执行此操作( 非常老的Exporter除外):

use Exporter 5.57 'import';

提示您添加my()的错误是因为您指定use strict; (除其他事项外,要求变量必须正确声明,除非它们是由程序包名称或特殊全局变量限定的程序包变量)。 our()与my()等效,后者将变量声明为包变量而不是词法变量,因此可以从声明它们的作用域之外访问它们。 最好用our()正确声明它们,而不是仅仅将它们移到use strict;之上use strict; 规避错误。

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

我想从lib中插入一个特定的子例程(akasay_hello_world),但这不起作用:

 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM