Raj (Basavaraj) Karadakal wrote: > Hi, > I am trying to package a perl script and the modules it > uses , in a > tar file. When untarred on any machine, the modules can be > found in a known > relative path with respect to the script. The path in which > these modules > are available can change depending on where the package got > untarred. So > only way the script can find modules is by using relative > path in @INC. But > for this to work the user should always be in the same > directory as the > script. To overcome this limitation of my script, I am trying to use a > reference to a subroutine in @INC, which returns the filehandle to the > module. When I run my script, I am able to find the module > and open it, and > return the filehandle, but the perl still complains that it > cannot find the > module. > > $/tmp/1.pl > Found /tmp/usr/mods/setuprhost.pm > Can't locate setuprhost.pm in @INC (@INC contains: > /usr/local/lib/perl5/5.6.1/sun4-solaris /usr/local/lib/perl5/5.6.1 > /usr/local/lib/perl5/site_perl/5.6.1/sun4-solaris > /usr/local/lib/perl5/site_perl/5.6.1 /usr/local/lib/perl5/site_perl . > CODE(0xfeda0)) at /home/users/bkaradak/tmp/install_card line 33. > BEGIN failed--compilation aborted at > /home/users/bkaradak/tmp/install_card > line 33. > > Following is my script:- > > #!/usr/local/bin/perl -w > > sub readMod { > my ($ref,$mod) = @_; > my $dir = $0; > my $modPath; > $dir =~ s/\/[^\/]+$//; > if ( -f "$dir/usr/mods/$mod" ) { > $modPath = "$dir/usr/mods/$mod"; > } > if ( -f "$modPath" ) { > print "Found $modPath\n"; > open (MOD,"$modPath") or die "Cannot open $modPath $!\n"; > return MOD ; }else { > return undef ; > } > } > > BEGIN { push ( @INC, \&readMod ); } > use setuprhost; > &setuprhost::Setup(<host name>); > > > What am I doing wrong?
You can't use a reference to a subroutine in @INC; you need to use paths. The FindBin module comes to the rescue here. Let's say your modules are in ../lib, relative to the script. You can do something like this in your script: use FindBin qw/$Bin/; use lib "$Bin/../lib"; use MyModule; see: perldoc FindBin perldoc lib -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]