Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: eval "require $module" vs. Module::Load::load($module)

by Corion (Patriarch)
on Aug 17, 2007 at 14:16 UTC ( [id://633299]=note: print w/replies, xml ) Need Help??


in reply to eval "require $module" vs. Module::Load::load($module)

Both of your methods hide the actual value of $@, which I consider a horrible design idea. $@ often contains valuable information and hiding that from the users/programmers makes for ugly debugging. Personally, I prefer the following idiom:

my $filename = $module; $filename =~ s-(::|')-/-g; $filename .= '.pm'; require $filename; # dies with an informative message

Looking at Module::Load, it again contains many weirdo checks that I have come to distrust when it comes to load failures - far too often I've had syntax errors in my modules hidden by UNIVERSAL::require to want such ...

Replies are listed 'Best First'.
Re^2: eval "require $module" vs. Module::Load::load($module)
by moritz (Cardinal) on Aug 17, 2007 at 15:38 UTC
    That method ignores that fact that perl search for .pmc files first, only then for .pm files.

    Most of the time there are no .pmc files, but iirc v6 uses them.

      Did you test your claim?

      corion@aliens:~/parent$ perl -we 'require "t/lib/FileThatOnlyExistsAsP +MC.pm"' corion@aliens:~/parent$ perl -we 'require "t/lib/FileThatOnlyExistsAsP +MC.pm" or die "Uhoh"' corion@aliens:~/parent$ ls -l t/lib/FileThatOnlyExistsAsPMC.pmc -rwxr-xr-x 2 corion corion 82 2007-08-02 22:57 t/lib/FileThatOnlyExist +sAsPMC.pmc corion@aliens:~/parent$ cat t/lib/FileThatOnlyExistsAsPMC.pmc package FileThatOnlyExistsAsPMC; sub exclaim { "I CAN FROM " . __PACKAGE__ } 1;
      Modern versions of perl will search for .pmc files if you require 'file.pm'. The change ocurred sometime between 5.00501 (which doesn't), and 5.6.0 (which does).
Re^2: eval "require $module" vs. Module::Load::load($module)
by djerius (Beadle) on Aug 17, 2007 at 14:37 UTC
    Your code is very similar to what is in Module::Load. Why is this better than a simple eval "require $module" which uses Perl's built-in module searching capability and doesn't require any path name manipulation?

      You shouldn't forget that every eval "..." must be followed by or die $@ or you will never find out why requireing your module failed. In that way, I consider my way to be more foolproof. My code is quite different from the code in Module::Load because my code does not try to guess whether it is a filename or a bareword module name and it also does not do any fancy games to massage the error message. I don't like modules that try to be fancy in their error messages because far too often I found that the one helpful error message got suppressed when I wanted to see it.

        I'm aware of Perl exceptions and how to handle them. What I do with $@ is really not germane to the question, which is to determine if there is any functional difference between Module::Load and eval "require $module".

        Your code uses the same general approach as Module::Load (albeit expressed more succinctly) namely to create a filename out of a module name and pass that to require.

        So, other than style, is there any technical reason to choose this method over

        eval "require $module"; die $@ if $@;

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://633299]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others rifling through the Monastery: (5)
As of 2024-03-29 13:03 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found