仅在子例程中需要时才使用Perl模块

时间:2017-06-05 13:25:36

标签: perl require perl-module

想象一下,我的脚本有这两个潜艇

sub with_json_mod{
    use JSON::Tiny;
    blah blah blah;
}

sub without_json_mod{
   blah blah blah;
}

我只想在未安装without_json_mod时使用JSON::Tiny

如果未安装JSON::Tiny,我怎样才能使Perl失败,而是使用without_json_mod sub?

我尝试在require中调用with_json_mod并且它似乎有效,但是当我尝试将其导入encode_json子时它不起作用,如

sub with_json_mod{
    require JSON::Tiny qw/encode_json/;
    blah blah blah;
}

2 个答案:

答案 0 :(得分:8)

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

您需要的是:

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

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

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

答案 1 :(得分:6)

userequire之间存在两个主要差异。

  1. use在编译时发生,require在运行时发生。
  2. use调用已加载包中的import()方法(如果存在),而require则不会。
  3. 因此您需要添加对import()的调用。

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