sapphirecat has asked for the wisdom of the Perl Monks concerning the following question:

At Is "use" same as include?, ikegami notes that "...loading a file without a package using require is wrong."

I'm currently working with a system which does things like require '../common/vars.pl'; to define subs or variables for the code that did the require (and vice-versa; some required files use the global $dbh). The required files do not establish their own package. I believe that this is the situation that ikegami was calling wrong.

I have already been burned by trying to define a constant in a required file (and found the reason). I can also see that plain "require" adds to the namespace every non-lexical in the required file, thus inheriting many arguments against "from foo import *" in Python.

I understand the proper path is to replace require with use and Exporter. Until that glorious day, I am seeking wisdom on any other dangers with require 'file.pl' for which I should be alert. My curiosity also leads me to ask: "Is 'require'ing a file that does define a package acceptable, then? Perhaps because it won't pollute the caller's namespace?"

"Basically, displaying invisible data is not maintainable."

Replies are listed 'Best First'.
Re: Dangers of require 'file.pl'
by runrig (Abbot) on Feb 25, 2011 at 17:20 UTC
    If you're requiring a file that defines a package, then it should be a ".pm" file, and you can just, e.g., require packagename without the ".pm" (and without any quotes around the package name), and this use of require is "acceptable."

      I see--in that case you end up with the same 'restrictions' as use packagename, which lead to the same benefits of robustness and nestability.

      "Basically, displaying invisible data is not maintainable."

        This was the way to import code prior to the invention of Perl modules (Perl 5?). Anyway, this use of require is obsolete now. It's not much more than an eval of some external code.

        --marmot

Re: Dangers of require 'file.pl'
by ikegami (Patriarch) on Feb 26, 2011 at 09:34 UTC

    I believe that this is the situation that ikegami was calling wrong.

    Yes. require won't load the file if it's already been loaded. It's wrong since I'm sure you didn't mean to perform such a check. Use do instead. Virtually the same, but without the check.