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

如何在Perl中检索脚本路径?(不是正在运行的),perl,path,cgi,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

我有一个调用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上使用Cwdabs_path,但是当我需要test.pl的“location”路径时,此方法返回“running”路径,以便修改它以构建config.xml路径。有什么想法吗

编辑:使用而不是abspath解决了我的问题,或者至少看起来是这样,我会做更多的测试

EDIT2:Ok realpath正常工作,但现在我有另一个问题。。。Perl插件使用了我制作的一些附加包,当然现在正在编写use MyPackage;不再工作,因为它在错误的文件夹中。。。有没有办法修改环境变量?我不知道有什么可以避免我修改数千行代码


EDIT3:Ok也解决了这个问题,我想我只需要在INC文件夹中安装我的软件包,这样我就不必再弄乱我的代码了。

以下函数将返回
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: $!";
使用Plugin::Foo;

打开我的$f,感觉好像你忘了在这里发布一些信息。比如:你如何找到
test.pl
开始?我有一个小文本文件,告诉test.cgi如何找到插件。你不能把这些信息(它从哪里加载了“test.pl”)传递给你在插件中调用的任何函数吗?@TLP,我想raz3r指定了她不感兴趣的运行脚本。