Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re^4: Importing constants into another module

by paulski (Beadle)
on Feb 03, 2005 at 02:38 UTC ( [id://427506]=note: print w/replies, xml ) Need Help??


in reply to Re^3: Importing constants into another module
in thread Importing constants into another module

Hehe...I'd figured this out just before you posted. Although I was going mainly off intuition.

Why was this causing the problem.?

Is is because Audit::Config.pm clashes with another PERL module called Config.pm in @INC?

Another weird thing...if I set the package for DNSCheck.pm as:

package Check::DNSCheck.pm

my script complains that it can't find the new{} constructor.

Can't locate object method "new" via package "DNSCheck" (perhaps you forgot to load "DNSCheck"?) at ./audit.pl line 32, <FILE> line 1.

I'd be interested to know why this is?

Thanks

Replies are listed 'Best First'.
Re^5: Importing constants into another module
by Tanktalus (Canon) on Feb 03, 2005 at 04:53 UTC

    Why is it causing a problem? According to perlmod, "use Module" is exactly like BEGIN { require Module; import Module; } - thus "use Audit::Config" is like BEGIN { require Audit::Config; import Audit::Config; }. Perl will go looking in the Audit::Config namespace for a function called "import". It will fail because the package loaded by the require Audit::Config part of that code really was Config rather than Audit::Config.

    Once you change the package to match the filename, with its full path, in proper perl convention, perl can now find the import sub in Audit::Config. "Wait a minute!" you may say. "I don't have an import sub in Audit::Config. I scanned my entire file - even the parts I didn't post!" Ah, but you do! It is placed there by the fact that you're deriving from Exporter! How convenient is that! Unfortunately in this case, there are some perl conventions that are actually hard-and-fast rules which brought you some headaches. In many cases, the fact that the package name doesn't line up with the bareword passed to "use" is a minor detail - just a convention without a requirement. However, many modules, including Exporter, assume that you follow convention and ... well, you get to post your code to PerlMonks :-)

      Makes sense...Thanks for that. :-)
Re^5: Importing constants into another module
by bmann (Priest) on Feb 03, 2005 at 02:52 UTC
    If you did use DNSCheck.pm, you need to leave off the file suffix. From perlmod (ignore the "traditional, non-OO" part of the quote):

    For example, to start a traditional, non-OO module called Some::Module +, create a file called Some/Module.pm and start with this template: package Some::Module; # assumes Some/Module.pm
    The "::" replaces the path separator.

      Sorry that should have read:

      package Check::DNSCheck;

      Serves me right for not copying and pasting. :-\

        Then you probably meant Check::DNSCheck->new

        This assumes there is a file Check/DNSCheck.pm containing package Check::DNSCheck;, and the script includes use Check::DNSCheck;

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (5)
As of 2024-04-25 14:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found