У меня есть сценарий, что я записал, что это может или использоваться на командной строке или как сценарий CGI и потребность определить, как сценарий назвали так, я могу произвести заголовок типа контента для веб-запросов (и возможно некоторые заголовки антикэша также). Моя первая мысль состоит в том, чтобы проверить на существование http переменных среды:
my $js = build_javascript();
if ( exists $ENV{HTTP_HOST} ) {
print "Content-type: text/javascript\n\n";
}
print $js;
Существует ли лучший путь?
В соответствии со спецификацией CGI в RFC3875 (раздел 4.1.4.), Переменная среды GATEWAY_INTERFACE будет иметь решающее значение для проверки того, работаете ли вы в контексте CGI. :
4.1.4.
GATEWAY_INTERFACE
Переменная
GATEWAY_INTERFACE
ДОЛЖНА быть установлена на диалекте CGI. используется сервером для связи со сценарием.
На самом деле нет хорошего способа узнать, был ли ваш сценарий запущен веб-сервером или из командной строки. В обоих случаях можно установить любую из переменных среды. Я часто запускаю программы CGI прямо из командной строки, например, для их тестирования.
Зная, что, если вы хотите выбрать одну переменную среды для использования, просто должен быть тот, который вы не устанавливаете в другой ситуации, или тот, который вы устанавливаете в обоих, но задаете разные значения. В этом случае выберите любую переменную среды, которая вам нравится.
Если вы хотите усложнить задачу, вы можете использовать что-то вроде IO :: Interactive , чтобы определить, подключены ли вы к терминалу. Если это не так, то файловый ханандл, который возвращает is_interactive
, является нулевым дескриптором файла, и результат никуда не денется:
print { is_interactive() } $http_header;
Если вам не нравится, как IO :: Interactive решает, вы может переопределить is_interactive
. Это очень короткий фрагмент кода, а интерфейс более высокого уровня очень приятный.
Если вы хотите усложнить ситуацию, вы можете использовать что-то вроде IO :: Interactive , чтобы определить, подключены ли вы к терминалу. Если это не так, то файловый ханандл, который возвращает is_interactive
, является нулевым дескриптором файла, и результат никуда не денется:
print { is_interactive() } $http_header;
Если вам не нравится, как IO :: Interactive решает, вы может переопределить is_interactive
. Это очень короткий фрагмент кода, а интерфейс более высокого уровня очень приятный.
Если вы хотите усложнить ситуацию, вы можете использовать что-то вроде IO :: Interactive , чтобы определить, подключены ли вы к терминалу. Если это не так, то файловый ханандл, который возвращает is_interactive
, является нулевым дескриптором файла, и результат никуда не денется:
print { is_interactive() } $http_header;
Если вам не нравится, как IO :: Interactive решает, вы может переопределить is_interactive
. Это очень короткий фрагмент кода, а интерфейс более высокого уровня очень приятный.
is_interactive
. Это очень короткий фрагмент кода, а интерфейс более высокого уровня очень приятный. вы можете повторно реализовать is_interactive
. Это очень короткий фрагмент кода, а интерфейс более высокого уровня очень приятный.