On 2011-06-09 23:46, John SJ Anderson wrote:
On Thu, Jun 9, 2011 at 17:42,<sono...@fannullone.us>  wrote:

Using either require, use, or do produces an error if I run the script without 
the module.  Is there a specific function for this purpose, or would I have to 
do something like wrap a 'use' or 'require' in an if statement?  I've tried 
that and it doesn't work so maybe I'm way off base on that one.

Something like:

   my $module_is_enabled = 0;
   eval 'use My::Special::Module';
   $module_is_enabled = 1 unless $@;

should do what you're looking for.

It is wrong to test on $@ like that, even only because it is a global variable.

In stead, you should test the return value of the eval.

For example like this:

perl -wle '
  my @loaded;
  my %error;
  my @modules = qw/ My::Data::Dumper  Data::Dumper  His::Data::Dumper /;

  for my $module ( @modules ) {
    eval qq{use $module; push \@loaded, \$module; 1}
      or do {
        my $eval_error = $@ || "Zombie error!";
        ( $error{ $module } = $eval_error ) =~ s/ \(.*//s;
      };
  }

  print "OK:", Dumper( \@loaded );
  print "ERROR:", Dumper( \%error );
'

which prints:

OK:$VAR1 = [
  'Data::Dumper'
];

ERROR:$VAR1 = {
  'His::Data::Dumper' => 'Can\'t locate His/Data/Dumper.pm in @INC',
  'My::Data::Dumper' => 'Can\'t locate My/Data/Dumper.pm in @INC'
};



And don't forget to check out the several plugin modules on CPAN!
See for example how Template::Plugin works.

--
Ruud


--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to