Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re: Export from module in subdirectory

by Don Coyote (Hermit)
on Oct 10, 2012 at 12:37 UTC ( [id://998219]=note: print w/replies, xml ) Need Help??


in reply to Export from module in subdirectory

Great thread! Just like to get some clarity on a couple of things.

If the use lib::test is not defined in test.pm and is therefore not found, how is the programme finding and executing test::min()? As SuicideJunkie has stated, this way works, therefore are the directory and subdirs in which the op is operating not already imported to the @INC?

Given, the assumption the op is already within an @INC'd directory, at what point, in the package declaration of lib::test do you 'cut-off' the system path, such that you are not declaring the::whole::path::to::lib::test?

The answers here have shed a lot of light on using modules in different directories which is great, as i am currently getting to grips with similar issues in strawberry perl. Particularly tobyinks' description of the way use functions.

Replies are listed 'Best First'.
Re^2: Export from module in subdirectory
by tobyink (Canon) on Oct 11, 2012 at 12:56 UTC

    You're looking at it backwards. Don't decide on the code because of the filenames; decide on the filenames because of the code.

    Choose a meaningful package name, like "Quux::Enhancer", and declare the package name in the module (somewhere near the top - the only things it makes sense to put before the package declaration are lexical pragma like use strict; use warnings; use 5.010;) using:

    package Quux::Enhancer;

    Now decide on which lib dir it's going to live inside. Often this will be a directory which is in perl's default @INC list. Within that directory create a subdirectory called Quux, and within that save your module as Enhancer.pm.

    Then in your script, if that lib dir is not in perl's default @INC, include this:

    use lib '/path/to/lib'; ## not including 'Quux'!!

    And then in the script load the module like this:

    use Quux::Enhancer;

    If you ever need to move the file, then that's fine; no need to change anything within the module; just make sure it's always called Enhancer.pm, and always kept in a directory called Quux. Then use lib to tell your Perl script where to find it.

    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

      Thanks tobyink, this helps explain why I don't need to declare the package all the way back to some random path separator. I shall have to have a bit of a play around with some self constructed modules and directories. This should help me appreciate the way use is working, and some of the other replies in this thread.

      Coyote

Log In?
Username:
Password:

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

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

    No recent polls found