Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re: Containing 'use lib' statements in modules to their own namespace

by shmem (Chancellor)
on Oct 19, 2015 at 11:26 UTC ( [id://1145315]=note: print w/replies, xml ) Need Help??


in reply to Containing 'use lib' statements in modules to their own namespace

You can place a copy of your perl's lib.pm into the directory where your debug versions of modules live. Then edit that lib.pm to remember the first path actually passed to use lib:

my $sticky_dir; # EDIT sub import { shift; my %names; foreach (reverse @_) { my $path = $_; # we'll be modifying it, so break the +alias $sticky_dir = $path unless $sticky_dir; # EDIT if ($path eq '') { ... # remove trailing duplicates @INC = grep { ++$names{$_} == 1 } @INC; # put sticky dir up front # EDIT @INC = ($sticky_dir, grep { ! m{^$sticky_dir$} } @INC); # EDIT return; }

See the lines marked with # EDIT. Make sure your directory is the first which gets into the private $sticky_dir variable. All subsequent calls to use lib will result in the directories being placed after the sticky directory:

#!/usr/bin/perl BEGIN{ # necessary unshift @INC,'/home/shmem/tmp/foo'; # so 'use lib' } # gets my version use lib "/home/shmem/tmp/foo"; # this dir is now sticky BEGIN { print "lib is ",$INC{"lib.pm"},$/; } use lib "/some/path"; BEGIN { print "\@INC after 'use lib \"/some/path\":\n"; print "$_\n" for @INC; } use lib "/another/path"; BEGIN { print "\@INC after 'use lib \"/another/path\":\n"; print "$_\n" for @INC; } __END__ lib is /home/shmem/tmp/foo/lib.pm @INC after 'use lib "/some/path": /home/shmem/tmp/foo /some/path /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl . @INC after 'use lib "/another/path": /home/shmem/tmp/foo /another/path /some/path /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl .

update: Instead of the first BEGIN block, invoking a script like this

perl -I/my/debug/directory script

prepends /my/debug/directory to @INC to have /my/debug/directory/lib.pm loaded at the first call to use lib inside the script - so you can switch on debugging without modifying the script at all.

perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'

Replies are listed 'Best First'.
Re^2: Containing 'use lib' statements in modules to their own namespace
by lgp171188 (Initiate) on Oct 20, 2015 at 11:18 UTC
    I didn't understand your solution after my first few scans of your answer (possibly because I'm new to perl). But once I read it properly and thoroughly, it totally made sense and it works as well! Thanks a ton!
      Thanks a ton!

      You're welcome. See my update on how to switch on debugging without modifying your scripts at all.

      perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others having an uproarious good time at the Monastery: (7)
As of 2024-04-19 10:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found