Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

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/Ingenious.pm, and the script using it is ~/apps/Handy/Process.pl, and the CWD is ~/data/stuff/, then how could Ingenious.pm 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.


Comment on Re: who am I?
Download Code
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.

    Cheers,
    Steffen

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (4)
As of 2014-07-14 01:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    When choosing user names for websites, I prefer to use:








    Results (253 votes), past polls