2012-03-29 2 views
0

У меня есть интерфейс CGI, который вызывает плагин Perl. Эти сценарии расположены в разных папках, и Perl должен читать XML-файл, который находится в другой папке. Чтобы сделать это просто я приведу вам пример:Как получить путь к скрипту в Perl? (не работает)

/a/b/cgi-bin/test.cgi # calls test.pl 
/e/plugins/test.pl # reads config.xml 
/e/etc/config.xml 

Теперь я не знаю, как сделать плагин Perl, чтобы прочитать файл конфигурации. Конечно, я не могу написать путь к скрипту, потому что завтра я могу изменить расположение этого файла. Я попытался использовать Cwd и abs_path на test.pl, но этот метод возвращает «запущенный» путь, вместо этого я хочу «путь местоположения» test.pl, поэтому я могу его модифицировать, чтобы построить путь config.xml , Есть идеи?

EDIT: Использование realpath вместо abspath решило мою проблему, или, по крайней мере, кажется, что я сделаю больше тестов.

EDIT2: Ok Realpath работает, но теперь у меня есть еще одна проблема ... Плагин Perl использует некоторые дополнительные пакеты, которые я сделал, но конечно сейчас пишу использование MyPackage; больше не работает, потому что он смотрит на неправильную папку ... Есть ли способ изменить переменную окружения? Я не знаю чего-то, что не позволит мне изменить тысячи строк кода.

EDIT3: Хорошо, так или иначе, я думаю, что я просто установлю свои пакеты в папке INC, чтобы мне больше не приходилось испортить мой код.

+0

Похоже, вы забыли опубликовать некоторую информацию здесь. Например: Как вы находите 'test.pl' для начала? – TLP

+0

У меня есть небольшой текстовый файл, который сообщает test.cgi, как найти плагины. – raz3r

+0

Не могли бы вы передать эту информацию (где она загрузила «test.pl») из любой функции, которую вы вызываете в плагине? –

ответ

0

Следующая функция возвращает путь пакета used() изд:

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__), чтобы они могли найти любую конфигурацию/данные, которые им нужны.

Смежные вопросы