仅在子例程中需要时才使用 Perl 模块
Posted
技术标签:
【中文标题】仅在子例程中需要时才使用 Perl 模块【英文标题】:Use Perl module only when it is needed within a subroutine 【发布时间】:2017-11-06 07:01:18 【问题描述】:想象一下我的脚本有这两个子
sub with_json_mod
use JSON::Tiny;
blah blah blah;
sub without_json_mod
blah blah blah;
我只想在未安装JSON::Tiny
时使用without_json_mod
。
如果没有安装 JSON::Tiny
,我怎样才能让 Perl 不会失败,而是使用 without_json_mod
子代替?
我试图在with_json_mod
中调用require
,它似乎可以工作,但是当我尝试让它导入encode_json
子时它不起作用
sub with_json_mod
require JSON::Tiny qw/encode_json/;
blah blah blah;
【问题讨论】:
eval "use Module; 1"?
我认为 eval 会受到影响,因为use
是编译时的事情。
是的,我正在考虑使用eval
对其进行测试,但很快就评论说,尽管您已经完美地总结了答案。 @Sobrique
【参考方案1】:
那是因为你错误地调用了require
。
你需要的是:
require JSON::Tiny;
JSON::Tiny -> import ( 'encode_json' );
您也可以将其包装在“eval”中,并测试$@
的值:
eval require JSON::Tiny; ;
warn $@ if $@;
【讨论】:
【参考方案2】:use
和 require
之间有两个主要区别。
use
发生在编译时,require
发生在运行时。
use
调用加载包中的import()
方法(如果存在),require
不调用。
所以你需要添加对import()
的调用。
sub with_json_mod
require JSON::Tiny;
JSON::Tiny->import('encode_json');
blah blah blah;
【讨论】:
以上是关于仅在子例程中需要时才使用 Perl 模块的主要内容,如果未能解决你的问题,请参考以下文章