use strict;
должны быть в программе КАЖДЫЙ Perl (а также use warnings;
и, вероятно, некоторые другие (в зависимости, кто вы говорите). Она не должна быть первой линии.
Остальная часть материала, который Вы присутствуют только несколько версий shebang. В системах на основе Unix и Unix для использования интерпретатора используется shebang. Если shebang не существует, будет использоваться текущая оболочка (то есть, если ваша оболочка поддерживает shebang1.).
Если вы находитесь в системе Windows, то shebang линия бесполезна. Windows использует суффикс файла, чтобы выяснить, как выполнить файл.
Вопрос в том, действительно ли вам нужна строка в строках, которые вы используете через испытательный жгут. Обычно я не выполняю эти тестовые сценарии отдельно, поэтому вообще не может быть необходимости в shebang. В редком случае вы хотите выполнить один из этих сценариев, вы всегда можете запустить их в качестве аргумента для самой команды perl
. То же самое происходит с модулями Perl.
Итак, почему shebang? Главным образом привычка. Я тоже положил его на свои тестовые скрипты и на свои модули. Если ничего другого, это упрощает запуск модулей и тестовых скриптов независимо для целей тестирования. Кроме того, shebang позволяет людям знать, что это скрипт Perl, а не сценарий оболочки или скрипт Python.
Есть небольшая проблема с shebang, хотя, и это связано с переносимостью. Если я поставлю #! /usr/bin/perl
на свою первую строку, а интерпретатор Perl находится в #! /usr/local/bin/perl
, я получу ошибку. Таким образом, многие из shebangs отражают местоположение интерпретатора Perl для этого разработчика.
Есть еще одна проблема: я использую Perlbrew, что позволяет мне устанавливать несколько версий Perl. Версия Perl, которую я сейчас имею в моей оболочке, находится в /Users/David/perl5/perlbrew/perls/perl-5.18.0/bin/perl
. Это нехорошо, если я передаю эту программу другому пользователю в другой системе. Или, если я решаю, что хочу протестировать свой скрипт Perl под 5.10.
Вариант #! perl
является попытка решить эту проблему. В SunOS (я полагаю) это выполнит Perl, который находится в вашем $PATH
(так как это может быть /usr/local/bin/perl
или /usr/share/bin/perl
или /usr/bin/perl
в зависимости от системы). Однако это не работает в большинстве блоков Unix.Например, на моем Mac я получал бы плохую ошибку интерпретатора.
Я использую #! /usr/bin/env perl
. Программа env
принимает аргумент perl
, видит, где perl
находится на моем $PATH
, а затем выполняет полный путь везде, где Perl находится на моем $ PATH. Это самый универсальный способ сделать shebang и способ, которым я рекомендую. Это позволяет использовать Perlbrew без проблем.
Примечание, я сказал почти универсал, а не универсал. Почти на всех системах, env
находится в /usr/bin
, но там, по-видимому, есть системы там, где env
находится либо на /bin
, либо находится в другом месте, либо нет в системе.
-w
включает предупреждения при выполнении Perl. До Perl 5.6 вы использовали это для включения предупреждений. После Perl 5.6 вы можете использовать более гибкие use warnings;
, а -w
теперь считается устаревшим . Программы могут использовать его, потому что они были изначально написаны до 5.6 и никогда не изменялись, или разработчик просто делал это по привычке.
-T
имеет отношение к taint mode. Режим Taint обычно используется для сценариев CGI. В принципе, в режиме Taint данные извне программы считаются tainted и не могут использоваться до untedted. Режим Taint также влияет на @INC
и PERLLIB
.
Настоящий ответ заключается в том, что ответа нет. Я бы поставил #! /usr/bin/env perl
как свою первую строку из привычки - даже если я никогда не ожидаю выполнить этот файл из командной строки Unix. Там нет никакой реальной необходимости для этих типов скриптов, которые почти всегда выполняются как часть установки, а не непосредственно из командной строки. То, что вы видите, действительно является результатом 30-летних привычек Perl и рывков.
1. Вашей оболочка поддерживает хижину, если вы не используете 30-летнюю версию оболочки Bourne или очень старую версию оболочки C.
2. Я действительно не знаю, когда -w
когда-либо официально устарел, но нет причин для его использования.
Олег - не знаете, почему вы так оскорблены этим вопросом. Некоторые .t-файлы, похоже, имеют линии shebang разного типа, а некоторые вообще отсутствуют. Просто интересно, есть ли лучшая практика или если она имеет какое-то значение. –
Я не обижаюсь. У меня есть две вещи, которые следует отметить по этому поводу: никаких отличий от любого другого сценария Perl - в ответе, и что shebangs - это kludge конкретной ОС (не очень удобно в ретроспективе). В нижней части моего ответа: не беспокойтесь о них - это бесполезно или, по крайней мере, просто относиться к ним как к любому другому сценарию. –
Слишком плохо, что это было закрыто. Существуют фактические различия между общим сценарием perl и скриптами, работающими под доказом. В частности, если вы хотите запустить тест под tainting (обычно я этого не делаю, даже если это хорошая идея), вам нужно иметь «#! Perl -T», по крайней мере, так, что perl начнет с включенного tainting. Теоретически флаг -w должен быть полезен для включения глобальных предупреждений, но доказывает, что это уже добавляет (это ошибка, IMO). Другие флаги также могут быть полезны. Тем не менее, в отличие от обычных скриптов, * * первая строка отлично подходит для вас, если вам это не нужно. – Tanktalus