http://qs321.pair.com?node_id=634510


in reply to Re^4: eval "require $class" seems wrong
in thread eval "require $class" seems wrong

eval-require is a common idiom for conditional loading of modules and there is a need for that.

No, you don't need either eval functions to conditionally load a module.

if (condition) { require Foo::Bar; }

And you don't need eval EXPR* to do exception handling.

eval { require Foo::Bar; }; if ($@) { require Foo::Baz; }

You only need eval EXPR to load a module whose name is not known at compile-time. The only things I can think of that fits that description are plugins/drivers, things well served by high-level modules.

Do you have an example that requires require $class other than plugins/drivers?

* — Remember, nothing wrong with eval BLOCK (called try in some other languages). Unlike eval EXPR, it doesn't invoke the Perl compiler. That means it doesn't incure a huge speed penalty and it doesn't require careful escaping and validation its argument.

Replies are listed 'Best First'.
Re^6: eval "require $class" seems wrong
by rvosa (Curate) on Aug 22, 2007 at 22:40 UTC
    My question was exactly about plugins/drivers, i.e. I'm working on a code base that does dynamic loading of plugins, and find my self having to write eval "require $class" because of that. I can't really think of many other cases either (perhaps a factory?).
Re^6: eval "require $class" seems wrong
by sgt (Deacon) on Aug 23, 2007 at 09:20 UTC

    still if you need a loop to pick up the first module to load of a list of modules (e.g say Math::Pari, GMP and other math libs). I am lazy and I don't want to write a require line for each one, or maybe I want to read my optional modules directly from the .yml shipped with the module etc...

    cheers --stephan