在我的应用程序中,我将所有模块放在一个目录中,我们只需将其称为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.pl
和libx
位于同一目录中。
答案 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
等),但从您的问题来看,您对安装的控制似乎对于这种方法有点限制。