Как получить путь к скрипту в Perl? (не бегущий) - PullRequest
0 голосов
/ 29 марта 2012

У меня есть CGI-интерфейс, который вызывает плагин Perl. Эти скрипты находятся в разных папках, и Perl должен читать XML-файл, который находится в другой папке. Для простоты приведу пример:

/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. Есть идеи?

РЕДАКТИРОВАТЬ: Использование realpath вместо abspath решило мою проблему, или, по крайней мере, так кажется, я проведу больше тестов.

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

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

1 Ответ

0 голосов
/ 29 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...