【问题标题】:Use Perl module only when it is needed within a subroutine仅在子例程中需要时才使用 Perl 模块
【发布时间】: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

标签: perl require perl-module


【解决方案1】:

那是因为你错误地调用了require

你需要的是:

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

您也可以将其包装在“eval”中,并测试$@ 的值:

eval { require JSON::Tiny; };
warn $@ if $@;

【讨论】:

    【解决方案2】:

    userequire 之间有两个主要区别。

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-21
      • 2020-08-14
      • 2016-06-05
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 2012-04-12
      • 1970-01-01
      相关资源
      最近更新 更多