我有一个调用Perl插件的CGI接口。这些脚本位于不同的文件夹中,Perl应该读取位于另一个文件夹中的XML文件。为简单起见,我举个例子:
/a/b/cgi-bin/test.cgi # calls test.pl
/e/plugins/test.pl # reads config.xml
/e/etc/config.xml
现在我不知道如何让Perl插件读取配置文件。当然我不能在脚本上写路径,因为明天我可能会改变这个文件的位置。我尝试在test.pl上使用 Cwd 和 abs_path ,但这个方法返回“运行”路径,而我想要test.pl的“location”路径,所以我可以修改它是为了构建config.xml路径。有什么想法吗?
编辑:使用realpath代替abspath解决了我的问题,或者至少看起来如此,我会做更多的测试。
EDIT2: Ok realpath有效,但现在我还有另外一个问题...... Perl插件使用了我制作的一些额外的软件包但是现在正在编写使用MyPackage; 没有因为它看起来在错误的文件夹上工作了...有没有办法修改环境变量?我不知道会有什么东西可以避免我改变数千行代码。
EDIT3: Ok解决了这个问题,我猜我只会在INC文件夹中安装我的软件包,所以我不必再搞乱我的代码了。
答案 0 :(得分:0)
以下函数将返回used()
ed包的路径:
use Cwd qw/abs_path/;
sub get_module_folder {
my $mkey = shift;
$mkey =~ s|\:\:|/|g;
$mkey .= '.pm';
my $mpath = $INC{$mkey};
$mpath =~ s|/[^/]+$||;
return abs_path($mpath);
}
因此,如果test.pl实现了一个包,比如Plugin::Foo
,那么只需将其称为:
use Plugin::Foo;
open my $f, '<', get_module_folder('Plugin::Foo').'/../etc/config.xml'
or die "can't open config file for reading: $!";
(假设我已正确理解你的文件夹结构)。
更新:使用abs_path。
我经常在自己的模块中包含此方法(将shift
替换为__PACKAGE__
),以便他们可以找到所需的任何配置/数据。