[英]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.