in reply to Re^2: use/require $MODULE (a variable)
in thread use/require $MODULE (a variable)

Why don't you simply use eval?

The friendly version using try-catch alias eval BLOCK needs a litte bit more typing than the quick-and-dirty eval STRING version, because require only converts barewords to filenames, but not variables.

eval STRING restarts the Perl parser for each tested module. If the module is already loaded, that's more expensive than needed. If not, the Perl parser must be started anyway to load the module.

#!/usr/bin/perl use strict; use warnings; # "Friendly" version using eval BLOCK foreach my $mod (qw(CGI Test::Simple Foo::Bomb Test::More)) { (my $fn="$mod.pm")=~s|::|/|g; # Foo::Bar::Baz => Foo/Bar/Baz.pm if (eval { require $fn; 1; }) { print "Module $mod loaded ok\n"; } else { print "Could not load $mod. Error Message: $@\n"; } }
Returns:
Module CGI loaded ok Module Test::Simple loaded ok Could not load Foo::Bomb. Error Message: Can't locate Foo/Bomb.pm in @ +INC (@INC contains: c:/strawberry/perl/lib c:/strawberry/perl/site/li +b .) at foo.pl line 6. Module Test::More loaded ok
#!/usr/bin/perl use strict; use warnings; # "Quick-and-dirty" version using eval BLOCK foreach my $mod (qw(CGI Test::Simple Foo::Bomb Test::More)) { if (eval "require $mod; 1;") { print "Module $mod loaded ok\n"; } else { print "Could not load $mod. Error Message: $@\n"; } }
Returns:
Module CGI loaded ok Module Test::Simple loaded ok Could not load Foo::Bomb. Error Message: Can't locate Foo/Bomb.pm in @ +INC (@INC contains: c:/strawberry/perl/lib c:/strawberry/perl/site/li +b .) at (eval 5) line 1. Module Test::More loaded ok

Note that there is a little difference in the error message.

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)