Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much

Re: who am I?

by wol (Hermit)
on Sep 25, 2008 at 09:43 UTC ( #713608=note: print w/replies, xml ) Need Help??

in reply to who am I?

I have a very closely related question - close enough to post here, I think:

How can a module determine the location of itself, independently of the CWD, and independently of the location of the script that is using it.

Eg. if the module is ~/lib/, and the script using it is ~/apps/Handy/, and the CWD is ~/data/stuff/, then how could best determine that it's in ~/lib/ ?

After a bit of head scratching, I cobbled together a generic enough "solution":

foreach (@INC) { if (-f "$_/".__PACKAGE__.".pm") { $iAmHere = $_; last; } }
This finds the location of the module either absolutely, or relative to the CWD, according to the content of @INC, which is sufficient for my purposes.

It feels like a hack, but hey - I wrote it before I found PerlMonks, so now seems like a good time to ask whether there's a better way of doing it. Any thoughts?

.sig : File not found.

Replies are listed 'Best First'.
Re^2: who am I?
by ikegami (Pope) on Sep 25, 2008 at 09:46 UTC
    use Cwd qw( realpath ); my $iAmHere = realpath( __FILE__ );
Re^2: who am I?
by moritz (Cardinal) on Sep 25, 2008 at 09:47 UTC
    Take a look at %INC, it gives you the absolute path of the loaded module.
Re^2: who am I?
by tsee (Curate) on Sep 26, 2008 at 07:51 UTC

    Other posters have given the canonical answers to this already, so I won't repeat them.

    Just a word of caution: if you're using modules that put objects or CODE refs in the @INC array, i.e. potentially load code without reading from a file, either method will not work.

    One such case are packaging modules such as PAR or ex::lib::zlib. So depending on how your module is used, the answer is: It's impossible to find its filename!

    If you're going to write code that requires the location of the module file name, please think about it some more. It might not be the smartest way to solve your problem.


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://713608]
[Corion]: erix: Heh ;) Transcribing/ writing notes is a good thing, at least for the stuff out of copyright!

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (5)
As of 2018-06-24 07:31 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (126 votes). Check out past polls.