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]

Reply via email to