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


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.

Replies are listed 'Best First'.
Re^2: who am I?
by ikegami (Patriarch) 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