in reply to Controlling "use" statements

You could use the module if, e.g.

BEGIN { our $DEBUG = 1 } use if $DEBUG, Data::Dumper; # ...

or

BEGIN { sub DEBUG {1} } use if DEBUG, Data::Dumper; # ...

Replies are listed 'Best First'.
Re^2: Controlling "use" statements
by ikegami (Patriarch) on Jun 13, 2007 at 18:00 UTC

    There's one problem with if: There's no equivalent to use Module ();.

    The conditional version of use Module; is use if $cond, 'Module';
    The conditional version of use Module LIST; is use if $cond, Module => LIST;

    However, use if $cond, Module => (); is the same as use if $cond, 'Module';

    Furtunlately, this doesn't seem to be a concern for the OP.

      That's right.  If you desperately needed that functionality, you could patch if.pm as shown below. (In case you'd rather not mess with the system version, just create a copy in some local lib directory and make that directory be searched before the system ones.)

      You could then for example write

      use if $DEBUG, 'Data::Dumper' => undef;

      to import nothing, just like with

      use Data::Dumper ();

      As the module is actually rather short, here is the full code:

      package if; sub work { my $method = shift() ? 'import' : 'unimport'; die "Too few arguments to `use if' (some code returning an empty lis +t in list context?)" unless @_ >= 2; return unless shift; # CONDITION my $p = $_[0]; # PACKAGE (my $file = "$p.pm") =~ s!::!/!g; require $file; # Works even if $_[0] is a keyword (like open) return if @_==2 && !defined $_[1]; # <--- ADDED my $m = $p->can($method); goto &$m if $m; } sub import { shift; unshift @_, 1; goto &work } sub unimport { shift; unshift @_, 0; goto &work } 1;

      When being passed undef, the line marked with "<--- ADDED" would make the sub return before executing the real import() of the target module via goto &$m (where $m is referring to import in this case).

      (Not well tested! &mdash use at your own risk...)