如何在Perl中检索脚本路径? (不是正在运行的)

时间:2012-03-29 07:44:14

标签: perl path cgi

我有一个调用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文件夹中安装我的软件包,所以我不必再搞乱我的代码了。

1 个答案:

答案 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__),以便他们可以找到所需的任何配置/数据。