Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I've been looking for a solution where I 'use' one or the other module on a conditional basis.
BEGIN { eval (use module_0); if ($@) { use module_1; } }
this does not work....suggestions please?

Replies are listed 'Best First'.
Re: conditional 'use'
by Corion (Patriarch) on Apr 29, 2010 at 18:50 UTC

    See use. You either want the string form of eval, or you want to use

    my $have_module_0 = eval { require module_0; module_0->import; 1 }; if (! $have_module_0) { require module_1; module_1->import; };
Re: conditional 'use'
by thundergnat (Deacon) on Apr 29, 2010 at 19:20 UTC

    Use the if pragma.

    use if (! eval {require module_0} ), module_1;
Re: conditional 'use'
by ikegami (Patriarch) on Apr 29, 2010 at 19:14 UTC
    BEGIN { my $module = eval { require Module0; 'Module0' } || eval { require Module1; 'Module1' } || die("Module0 or Module1 are required\n"); $module->import(); }

    You can pass arguments to import if you want to import specific symbols (like use Module qw( ... );) instead of the defaults (like use Module;), or you can omit the call entirely if you don't want to import anything (like use Module qw();).

    Also, if you want $module to be available later on, you can move the my outside of the BEGIN.

    my $module; BEGIN { $module = eval { require Module0; 'Module0' } || eval { require Module1; 'Module1' } || die("Module0 or Module1 are required\n"); $module->import(); }