in reply to Re: Howto Call Package from a Subdirectory
in thread Howto Call Package from a Subdirectory

unfortunately FindBin is not very reliable, especially in a persistent web environment (mod_perl). this has been discussed before:

the correct method, learned from the monks, that i currently use without problems in shell/web programs:

use vars qw( $RealBin ); BEGIN { use File::Spec::Functions qw( rel2abs splitpath catpath); $RealBin = catpath ((splitpath (rel2abs ($0)))[0,1]); } use lib "$RealBin/modules_src/"; # relative path from your Perl progr +am
:)))))

Replies are listed 'Best First'.
Re^3: Howto Call Package from a Subdirectory
by bart (Canon) on May 07, 2007 at 12:32 UTC
    That works, more or less, but gives me a warning, on Windows/perl5.6.1: Use of uninitialized value in concatenation (.) or string at [...]/lib/File/Spec/Win32.pm line 240.

    The reason is the lack of the third parameter to catpath.

    What's more, it still has a trailing backslash (probably a slash on Unix), which is not my idea of ideal. It might work, or it might fail on some platforms.

    The following code no longer produces the warning, but I still get the trailing backslash:

    $RealBin = catpath ((splitpath (rel2abs ($0)))[0,1], '');

    File::Spec is dumb.

      I now use this (only tested on Linux):

      our $RealBin; BEGIN { use File::Basename 'dirname'; use File::Spec::Functions 'rel2abs'; $RealBin = rel2abs( dirname( __FILE__ ) ); } use lib "$RealBin/lib";