为什么“使用lib”不会以这种方式生效?

时间:2009-08-18 05:08:22

标签: perl

在我的应用程序中,我将所有模块放在一个目录中,我们只需将其称为libx。 由于用户可以选择部署应用的位置,因此我不想对lib路径进行硬编码。

所以在myapp.pl的开头,我编写了以下几行代码。

#! /usr/bin/perl -w
use strict;

my $curr_dir = $0;
my $curr_lib = $curr_dir;
$curr_lib =~ s/myapp\.pl/libx/;

use $curr_lib ;

而不是得到我期待的东西,我得到了编译错误!

我的代码出了什么问题?我不想在使用use lib时对lib路径进行硬编码,我该怎么做?


抱歉,我忘了提及部署该应用时,myapp.pllibx位于同一目录中。

3 个答案:

答案 0 :(得分:15)

使用在编译时发生,而不是在运行时发生,因此您的变量尚未设置。 你可以这样做:

my $curr_lib;
BEGIN {
    $curr_lib = $0;
    $curr_lib =~ s/myapp\.pl/libx/;
}    
use lib $curr_lib;

或者你可以:

use FindBin;
use lib "$FindBin::Bin/libx";

答案 1 :(得分:2)

我之前也遇到过麻烦。发生的事情是Perl对你的代码进行两次传递:一次编译它,第二次运行它。在您的示例中,第4,5和6行在运行时才执行,但use在编译期间生效。

一种可能性是将它全部放在BEGIN{}块中,这将使代码在编译时执行。我已经做到了,但这很麻烦/丑陋。 (BTW,而不是$0,您需要在Perl中使用$ARGV[0]

告诉Perl在哪里获取库的最佳方法是使用-I标志。您可以将其放在#!行,或者如果您从另一个脚本启动脚本,则可以将其作为

启动
perl -I/your/directory/libx your_script.pl

可以使用相对路径,所以也许

perl -I./libx script.pl

适合你。

答案 2 :(得分:1)

use xxx编译时指令,而不是运行时指令。您无法在运行的脚本中以编程方式设置它。

您可能需要尝试require rather than use

如果您需要use,则需要设置$PERL5LIB环境变量以确保正确定位和使用您的模块,或者将您的shebang行更改为#! /usr/local/perl -w -I/path/to/libx。还有其他方法(local::lib等),但从您的问题来看,您对安装的控制似乎对于这种方法有点限制。