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

Joh*_*Loo 1 perl perl-module require

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

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

sub without_json_mod{
   blah blah blah;
}
Run Code Online (Sandbox Code Playgroud)

我只想without_json_mod在JSON::Tiny没有安装时使用.

如果JSON::Tiny没有安装,我如何使Perl不失败,而是使用without_json_modsub代替?

我试着打电话给require在with_json_mod和它似乎工作,但是当我试着让它导入它不起作用encode_json子在

sub with_json_mod{
    require JSON::Tiny qw/encode_json/;
    blah blah blah;
}
Run Code Online (Sandbox Code Playgroud)

Sob*_*que 8

那是因为你打电话require不对.

你需要的是:

require JSON::Tiny;
JSON::Tiny -> import ( 'encode_json' );
Run Code Online (Sandbox Code Playgroud)

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

eval { require JSON::Tiny; };
warn $@ if $@;
Run Code Online (Sandbox Code Playgroud)


Dav*_*oss 6

use和之间有两个主要区别require.

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

所以你需要添加一个电话import().

sub with_json_mod{
    require JSON::Tiny;
    JSON::Tiny->import('encode_json');
    blah blah blah;
}
Run Code Online (Sandbox Code Playgroud)