http://www.perlmonks.org?node_id=998219


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