仅在子例程中需要时才使用 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】:

userequire 之间有两个主要区别。

    use 发生在编译时,require 发生在运行时。 use 调用加载包中的import() 方法(如果存在),require 不调用。

所以你需要添加对import()的调用。

sub with_json_mod
    require JSON::Tiny;
    JSON::Tiny->import('encode_json');
    blah blah blah;

【讨论】:

以上是关于仅在子例程中需要时才使用 Perl 模块的主要内容,如果未能解决你的问题,请参考以下文章

在子例程中保留 VBA 函数值

将两个或多个数组传递给 Perl 子例程

在子例程中退出 Select Case

如何在 Perl 子例程中处理已捕获和未捕获的错误?

如何在Perl子例程中使用$ a和$ b

进入由 shell 脚本设置的 perl 程序环境变量