Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re: Problems with 'use lib'

by shenme (Priest)
on Aug 21, 2003 at 06:53 UTC ( [id://285378]=note: print w/replies, xml ) Need Help??


in reply to Problems with 'use lib'

When and where does $projectLocation get defined?

The "use lib" action is done at compile time, before statements like

my $projectLocation = '/some/other/place';
can be executed to set the variable.   You need to force your value to be defined during compilation.   Perhaps this might be more like what you were thinking?
BEGIN { my $projectLocation = '/some/other/place'; use lib $projectLocation; }
But then this gets back to something like the starting question - where does the value for $projectLocation come from?   Ah, an environment variable.   So maybe
BEGIN { use lib $ENV{MYLIBRARYDIR}; printf "in BEGIN: '%s'\n", join("', '", @INC ); }
will do what you want.

Replies are listed 'Best First'.
Re: Re: Problems with 'use lib'
by esh (Pilgrim) on Aug 21, 2003 at 07:38 UTC

    I don't think this code will do what you want:

    BEGIN { my $projectLocation = '/some/other/place'; use lib $projectLocation; }
    The "use lib" inside the BEGIN block will be executed before the assignment since it is also inside the BEGIN block. Try this instead:
    my $projectLocation; BEGIN { $projectLocation = '/some/other/place'; } use lib $projectLocation;
    The "use" is like another BEGIN so these two pieces of code will be executed in sequence now.

    -- Eric Hammond

      I was going to say that wasn't true, but went back and looked at the last test program I was using and decided I hadn't tested that situation correctly.   Using code
      BEGIN { my $foo = 'foom'; use lib $foo; }
      results in error messages
      Use of uninitialized value in string eq at /usr/lib/perl5/5.8.0/i386-linux-thread-multi/lib.pm line 29.
      Empty compile time value given to use lib at hotshot.pl line 5
      
      Using your code
      my $foo; BEGIN { $foo = 'foom'; } use lib $foo; printf "executing: '%s'\n", join("', '", @INC );
      returns the desired results
      executing:  'foom', '/usr/lib/perl5/5.8.0/i386-linux-thread-multi', ... , '.'
      
      Just to try something different I tried
      BEGIN { our $foo = 'foom'; } use lib $foo;
      which also worked.

      Another thing to put in the list of things to re-study.   Key is that "use" (and other pragmas?) are executed (at compile time) before surrounding code at the same apparent 'level'.   By enclosing code in a BEGIN block ahead of the "use" we force it into compile time execution before the following "use" is executed.   (Or something like that ;-)

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others examining the Monastery: (3)
As of 2024-04-16 04:29 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found