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)
| [reply] [d/l] |
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);
| [reply] [d/l] |
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
| [reply] [d/l] [select] |
... path happens to be the current path of the script plus /lib ...
If the directory you want to add is a fixed and existing sub-directory of the script directory, I don't understand why lib won't work:
c:\@Work\Perl\monks\dougbot>perl -wMstrict -le
"use lib './junque';
local $\" = qq{'\n'};
print qq{'@INC'};
"
'./junque'
'C:/strawberry/5.14/perl/site/lib'
'C:/strawberry/5.14/perl/vendor/lib'
'C:/strawberry/5.14/perl/lib'
'.'
c:\@Work\Perl\monks\dougbot>dir
...
12/04/2013 02:35 PM <DIR> .
12/04/2013 02:35 PM <DIR> ..
12/04/2013 02:06 PM 9,730 array_disjunct_1.pl
12/04/2013 02:35 PM <DIR> junque
| [reply] [d/l] |
I think a better way to deal with this type of problem is to use the PERL5LIB env variable, rather than a $path variable inside your script. | [reply] |
use File::FindLib - Find and use a file/dir from a directory above your script file | [reply] |
If you are using use lib somepath, I fail to see the advantage of having somepath stored in a $variable, I think that in almost all cases that I can think of, somepath could just be a hard coded directory. The only exception that I can think of is when yo want to deploy a module on different environments having different paths, but in such a case, you probably want to go further and have a real installation procedure that will define or export the right paths.
| [reply] [d/l] [select] |