Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery

Re: use lib statement with path variable

by Eily (Prior)
on Dec 04, 2013 at 19:30 UTC ( #1065639=note: print w/replies, xml ) Need Help??

in reply to use lib statement with path variable

use lib ($some_path,);

Make sure the $some_path variable is set early enough. For example, in a BEGIN block, because the value might only get affected at run time while "use" is called at compile time (straightaway)

Replies are listed 'Best First'.
Re^2: use lib statement with path variable
by sans-clue (Beadle) on Dec 04, 2013 at 19:41 UTC
    Well this is what I am doing, finding the current path of the script first, so I am not sure if I can set $some_path any earlier.
    #!/usr/bin/perl use File::Spec; use File::Basename; $some_path = dirname(File::Spec->rel2abs(__FILE__)); use lib qw($some_path/lib);

      There are two problems there. qw takes each blank characters separated elements in its operand (most often, words separated by spaces) and reads them in a simple quotish context. Put a simpler way, qw(A $b C %h); could also be written ('A', '$b', 'C', '%h'). In Ruby there is a qw-like construct that allows double-quotish interpretation, but this is Perl. So you instead have to write use lib ("$some_path/lib",); (the comma is optional, I just always put an extra comma in a single element list).

      The second issue is that use is called straightaway, so you could say that perl reads your program :

      # Compiling using File::Spec using File::Basename there is a global variable called $some_path add to path $some_path/lib _Compilation complete_ # Running $some_path = dirname(File::Spec->rel2abs(__FILE__));
      This is of course really simplified.

      The BEGIN keyword means that a block has to be executed during compile time, and not to wait after compilation completion. You should write:

      my $some_path; BEGIN { $some_path = "/my/path"; } use lib "$some_path/lib"; # Yeah, you don't even need the parenthesis, + Perl is clever enough for you # Edit : thanks dave_the_m for the correction

        Yeah, you don't even need the parenthesis, Perl is clever enough for you...

        You never need the parentheses there, unless you're doing something strange with precedence or associativity. A list is a list is a list.

        You should write: ...
        The use statement needs to be outside the BEGIN block, e.g.
        my $some_path; BEGIN { $some_path = "/my/path"; } use lib "$some_path/lib";


        Muy bueno !!! Thanks so much

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1065639]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (4)
As of 2018-05-27 05:46 GMT
Find Nodes?
    Voting Booth?