尝试在Perl中使用Module并在模块不可用时打印消息

时间:2009-07-07 18:53:29

标签: perl import module

我希望能够在Perl中执行此操作(下面的代码是Python lol)

try:
  import Module
except:
  print "You need module Module to run this program."

有没有人知道怎么做?

6 个答案:

答案 0 :(得分:18)

TIMTOWTDI

eval "use Module; 1" or die "you need Module to run this program".

require Module or die "you need Module to run this program";
Module->import;

use Module::Load;

eval { load Module; 1 } or die "you need Module to run this program";

您可以在Module::Load上找到CPAN

答案 1 :(得分:11)

您可以使用Module::Load::Conditional

use Module::Load::Conditional qw[can_load check_install requires];


my $use_list = {
    CPANPLUS     => 0.05,
    LWP          => 5.60,
    'Test::More' => undef,
};

if(can_load( modules => $use_list )) 
{
   print 'all modules loaded successfully';
} 
else 
{
   print 'failed to load required modules';
}

答案 2 :(得分:2)

有很多模块可以做到这一点;请参阅CPAN modules that (can) load other modules列表。 但是,依赖外部模块(如果它不存在会怎样?)会有点风险。 好吧,至少,如果你依赖于Moose,Class::Load可以安全使用,因为这是Moose的先决条件:

#!/usr/bin/env perl
use strict;
use utf8;
use warnings qw(all);

use Class::Load qw(try_load_class);

try_load_class('Module')
    or die "You need module Module to run this program.";

答案 3 :(得分:1)

如下所示,use Net::SMTP如果你安装了模块,或者作为最后的手段,那就是俗气的sendmail标注。

my $mailmethod = eval "use Net::SMTP; 1" ? 'perl' : 'sendmail';

答案 4 :(得分:0)

use strict;
use warnings;
use Module;

如果您没有安装Module,则会收到错误“无法在@INC中找到Module.pm(@INC包含:...)。”这是可以理解的。

您是否需要/需要更具体的消息?

答案 5 :(得分:0)

以下是我的意思:

sub do_optional_thing {
    init_special_support();
    Module::Special::wow();
}

sub init_special_support {
    # check whether module is already loaded
    return if defined $INC{'Module/Special'};

    eval {
        require Module::Special;
        Module::Special->import();
    };

    croak "Special feature not supported: Module::Special not available" if $@;
}