Как повторно использовать функции, определенные в одном скрипте, из другого в Perl, работая как cgi под Apache? - PullRequest
1 голос
/ 28 марта 2011

Я пытаюсь организовать несколько сценариев perl таким образом, чтобы я мог повторно использовать некоторые функции между ними.Директива require требует, однако, не работает, когда скрипт запускается как CGI под Apache.Я пробовал это:

require "common.pl"

, но это не работает под Apache.

Я также пробовал это:

use File::Basename;
use Cwd qw(abs_path);
require abs_path(dirname($0))."/common.pl";

, который работает как нав командной строке и под Apache на моем локальном сервере, но не на сервере моего веб-хоста.

Знаете ли вы, как правильно «требовать» сценарий perl, чтобы он работал как в командной строке, так и под Apache?

Редактировать : Я ищу способ (необязательно использующий 'require') сделать функции, определенные в 'common.pl', доступными для скрипта, вызывающего это здесь.Таким образом, в основном у меня есть 2 скрипта 'foo.pl' и 'bar.pl', из которых я хотел бы повторно использовать функции, написанные в 'common.pl'.Как правильно сделать это в Perl?'require' отлично работает в командной строке, но не в Apache ... У меня нет контроля над% INC, и я не могу жестко закодировать полный путь к 'common.pl'.

I can '• жестко закодируйте путь к «common.pl», поскольку этот набор сценариев должен выполняться на 3 разных серверах, каждый из которых имеет свой абсолютный путь.

Edit2 : сообщение об ошибке Iчто происходит при запуске с использованием mod_perl (я ошибочно заявлял, что все это происходило при работе под Apache / cgi, но у меня был mod_perl на одной из 3 установок, на двух других установках скрипты выполнялись как обычные скрипты cgi, ибыло связано с оператором 'require', который работает нормально при обычном cgi).Ошибка выглядит следующим образом:

Can't locate common.pl in @INC (@INC contains: /Library/Perl/Updates/5.10.0/darwin-thread-multi-2level /Library/Perl/Updates/5.10.0 /System/Library/Perl/5.10.0/darwin-thread-multi-2level /System/Library/Perl/5.10.0 /Library/Perl/5.10.0/darwin-thread-multi-2level /Library/Perl/5.10.0 /Network/Library/Perl/5.10.0/darwin-thread-multi-2level /Network/Library/Perl/5.10.0 /Network/Library/Perl /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level /System/Library/Perl/Extras/5.10.0 . /usr) at /.../check.pl

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

Настройка программного обеспечения для различных развертываний - это реальность.Иногда «магия» может помочь, но часто она может привести и к непроницаемым проблемам.

У вас есть контроль над окружающей средой?Я бы установил переменные окружения (http://httpd.apache.org/docs/current/mod/mod_env.html) в вашей конфигурации Apache и использовал бы их как путь к вашему требованию.

1 голос
/ 28 марта 2011

Почему жесткое кодирование трех разных путей будет проблемой?

use Sys::Hostname;
my $host = hostname();
$host eq 'foo' and push @INC, '/foo';
$host eq 'bar' and push @INC, '/bar';
$host eq 'baz' and push @INC, '/baz';
require 'common.pl';

Конечно, это не самое элегантное решение, но если оно работает ...

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