in reply to Re^2: constants wont optimize
in thread constants wont optimize

Actually, as you've found out, your way is the complicated one.

Simple:

use constant haveMod => eval { require mod; };

And for the non-trivial:

my $haveMod; BEGIN { ...[ something complicated ]... $haveMod = ...; } use constant haveMod => $haveMod;
or even
BEGIN { ...[ something complicated ]... require constant; import constant haveMod => ...; }

PS - require always returns true, so the "1" is redundant.

Replies are listed 'Best First'.
Re: [DUP] Re^3: constants wont optimize
by patcat88 (Deacon) on Jul 10, 2011 at 20:58 UTC
    I can't call "require". I am sniffing to see what PMs were loaded before the "use" that loads my PM. Its so my PM will integrate with other PMs loaded BEFORE my PM. Sort of like threads and threads::shared.

      I can't call "require".

      You seem to have lost track of what you said because you're the one who used require. You said

      use if eval { require mod; 1 }, qw' constant haveMod 1 ';

      is ugly because constant is being used. I pointed out that it's simply not true. Not only does that code not work, but it can be written as

      use constant haveMod => eval { require mod; };

      I am sniffing to see what PMs were loaded before the "use" that loads my PM.

      Asked and answered. Or if you want to check for multiple modules,

      use constant { map { no strict 'refs'; ( my $constant = $_ ) =~ s/:://g; "have$constant" => ${"${_}::VERSION"} } qw( Foo::Mod Bar::Mod ); };