Spec-Zone.ru › Perl 5.34

perlrun

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНТАКСИС
  • ОПИСАНИЕ
    • #! и цитирование в не-Unix-системах
    • Расположение Perl
    • Командные переключатели
  • СРЕДА
  • ПОРЯДОК ПРИМЕНЕНИЯ

ИМЯ

perlrun - как выполнить интерпретатор Perl

СИНТАКСИС

perl [ -sTtuUWX ] [ -hv ] [ -V[:configvar] ] [ -cw ] [ -d[t][:debugger] ] [ -D[number/list] ] [ -pna ] [ -Fpattern ] [ -l[octal] ] [ -0[octal/hexadecimal] ] [ -Idir ] [ -m[-]module ] [ -M[-]'module...' ] [ -f ] [ -C [number/list] ] [ -S ] [ -x[dir] ] [ -i[extension] ] [ [-e|-E] 'command' ] [ -- ] [ programfile ] [ argument ]...

ОПИСАНИЕ

Обычный способ запуска программы Perl - сделать её непосредственно исполняемой или передать имя исходного файла в качестве аргумента в командной строке. (Также возможна интерактивная среда Perl - см. perldebug для получения подробностей.) При запуске Perl ищет вашу программу в одном из следующих мест:

  1. Указано построчно с помощью переключателей -e или -E в командной строке.

  2. Содержится в файле, указанном первым именем файла в командной строке. (Обратите внимание, что системы, поддерживающие обозначение #!, вызывают интерпретаторы таким образом. См. "Расположение Perl".)

  3. Передаётся неявно через стандартный ввод. Это работает только в том случае, если нет аргументов имени файла - чтобы передать аргументы в программу, считывающую STDIN, вы должны явно указать "-" для имени программы.

В методах 2 и 3 Perl начинает разбор входного файла с начала, если не указан переключатель "-x", в этом случае он ищет первую строку, начинающуюся с #! и содержащую слово "perl", и начинает с неё. Это полезно для запуска программы, вложенной в более крупное сообщение. (В этом случае вы укажете конец программы с помощью маркера __END__. )

Строка #! всегда проверяется на переключатели при разборе строки. Таким образом, если вы находитесь на машине, которая допускает только один аргумент со строкой #!, или хуже, даже не распознаёт строку #!, вы по-прежнему можете получить согласованное поведение переключателей независимо от того, как был вызван Perl, даже если использовался "-x" для поиска начала программы.

Поскольку исторически некоторые операционные системы молча отсекали интерпретацию ядром строки #! после 32 символов, некоторые переключатели могут передаваться в командной строке, а некоторые — нет; вы даже можете получить "-", без буквы, если не будете внимательны. Вероятно, вы хотите убедиться, что все ваши переключатели находятся либо перед, либо после этой границе в 32 символа. Большинство переключателей не заботятся о том, обрабатываются ли они избыточно, но получение "-" вместо полного переключателя может заставить Perl попытаться выполнить стандартный ввод вместо вашей программы. И частичный переключатель -I также может привести к неожиданным результатам.

Некоторые переключатели заботятся о том, обрабатываются ли они дважды, например, комбинации -l и -0. Либо поместите все переключатели после границы в 32 символа (если применимо), либо замените использование -0цифр на BEGIN{ $/ = "\0digits"; }.

Разбор #! переключателей начинается там, где упоминается "perl" в строке. Последовательности "-*" и "- " специально игнорируются, чтобы вы могли, если захотите, сказать

#!/bin/sh
#! -*- perl -*- -p
eval 'exec perl -x -wS $0 ${1+"$@"}'
    if 0;

чтобы позволить Perl увидеть переключатель "-p".

Аналогичный трюк включает программу env, если она у вас есть.

#!/usr/bin/env perl

В приведённых выше примерах используется относительный путь к интерпретатору perl, получая любую версию, которая первой встречается в пути пользователя. Если вам нужна определённая версия Perl, например, perl5.14.1, вы должны поместить её непосредственно в путь строки #!.

Если строка #! не содержит слова "perl" или "indir", вместо интерпретатора Perl выполняется программа, названная после #!. Это немного странно, но это помогает пользователям на машинах, которые не выполняют #!, поскольку они могут сообщить программе, что их оболочка — /usr/bin/perl, и Perl затем перенаправит программу к правильному интерпретатору для них.

После нахождения вашей программы Perl компилирует всю программу во внутренний вид. Если есть какие-либо ошибки компиляции, попытка выполнения программы не предпринимается. (Это отличается от типичного сценария оболочки, который может быть выполнен частично, прежде чем обнаружится синтаксическая ошибка.)

Если программа синтаксически правильна, она выполняется. Если программа завершается без срабатывания оператора exit() или die(), неявное exit(0) предоставляется для указания успешного завершения.

#! и цитирование в не-Unix-системах

Техника #! Unix может быть смоделирована в других системах:

OS/2

Введите

extproc perl -S -your_switches

в первой строке файла *.cmd ("-S" из-за ошибки в обработке `extproc' в cmd.exe).

MS-DOS

Создайте пакетный файл для запуска вашей программы и закодируйте её в ALTERNATE_SHEBANG (см. файл dosish.h в дистрибутиве исходных кодов для получения дополнительной информации).

Win95/NT

Установка Win95/NT при использовании установщика ActiveState для Perl изменит реестр, чтобы связать расширение .pl с интерпретатором perl. Если Perl установлен другими средствами (включая сборку из исходных кодов), вам может потребоваться самостоятельно изменить реестр. Обратите внимание, что это означает, что вы больше не можете отличить исполняемую программу Perl от файла библиотеки Perl.

VMS

Введите

$ perl -mysw 'f$env("procedure")' 'p1' 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8' !
$ exit++ + ++$status != 0 and $exit = $status = undef;

вверху вашей программы, где -mysw — любые командные переключатели, которые вы хотите передать в Perl. Вы можете вызвать программу напрямую, сказав perl program, или как процедуру DCL, сказав @program (или неявно через DCL$PATH, просто используя имя программы).

Эта формула немного сложна для запоминания, но Perl отобразит её, если вы скажете perl "-V:startperl".

Интерпретаторы команд в не-Unix-системах имеют совершенно другие идеи о цитировании, чем Unix-оболочки. Вам нужно будет изучить специальные символы в вашем интерпретаторе команд (*, \ и " — распространённые) и то, как защищать пробелы и эти символы для запуска однострочных команд (см. -e ниже).

В некоторых системах вам может потребоваться изменить одинарные кавычки на двойные, что вы не должны делать в Unix или системах Plan 9. Вам также может потребоваться изменить одиночный % на %%.

Например:

# Unix
perl -e 'print "Hello world\n"'

# MS-DOS, etc.
perl -e "print \"Hello world\n\""

# VMS
perl -e "print ""Hello world\n"""

Проблема в том, что ни один из этих методов не является надёжным: он зависит от команды, и вполне возможно, что ни один из них не работает. Если 4DOS — это оболочка командной строки, это, вероятно, сработает лучше:

perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""

CMD.EXE в Windows NT включил много стандартной функциональности Unix, когда никто этого не замечал, но просто попробуйте найти документацию по правилам цитирования.

Нет общего решения для всего этого. Это просто беспорядок.

Расположение Perl

Возможно, это очевидно, но Perl полезен только тогда, когда пользователи могут легко его найти. По возможности, хорошо, чтобы /usr/bin/perl и /usr/local/bin/perl были символическими ссылками на фактический двоичный файл. Если это невозможно сделать, системным администраторам настоятельно рекомендуется поместить (символические ссылки на) perl и его вспомогательные утилиты в директорию, обычно находящуюся в пути пользователя PATH, или в какое-либо другое очевидное и удобное место.

В этой документации #!/usr/bin/perl в первой строке программы будет обозначать любой метод, который работает в вашей системе. Вам рекомендуется использовать конкретный путь, если вам важна конкретная версия.

#!/usr/local/bin/perl5.14

или если вам нужно работать как минимум с определённой версией, поместите в начало своей программы оператор, подобный этому:

use 5.014;

Командные переключатели

Как и в случае со всеми стандартными командами, одиночный переключатель может быть объединён со следующим переключателем, если таковой имеется.

#!/usr/bin/perl -spi.orig   # same as -s -p -i.orig

Знак -- сигнализирует о конце опций и отключает дальнейшую обработку опций. Любые аргументы после -- обрабатываются как имена файлов и аргументы.

Переключатели включают:

-0[octal/hexadecimal]

устанавливает разделитель записей входного файла ($/) в виде восьмеричного или шестнадцатеричного числа. Если цифр нет, разделителем является нулевой символ. Другие переключатели могут предшествовать или следовать за цифрами. Например, если у вас есть версия find, которая может выводить имена файлов, завершённые нулевым символом, вы можете сказать так:

find . -name '*.orig' -print0 | perl -n0e unlink

Особое значение 00 заставит Perl загружать файлы в режиме абзацев. Любое значение 0400 или выше заставит Perl загружать файлы целиком, но по соглашению для этой цели обычно используется значение 0777.

Вы также можете указать разделительный символ с помощью шестнадцатеричной нотации: -0xHHH..., где H являются допустимыми шестнадцатеричными цифрами. В отличие от восьмеричной формы, эта форма может использоваться для задания любого символа Юникода, даже тех, которые находятся за пределами 0xFF. Итак, если вам действительно нужен разделитель записей 0777, укажите его как -0x1FF. (Это означает, что вы не можете использовать опцию "-x" с именем каталога, состоящим из шестнадцатеричных цифр, иначе Perl посчитает, что вы указали шестнадцатеричное число для -0.)

-a

включает режим автоматического разделения при использовании с "-n" или "-p". Неявная команда разделения для массива @F выполняется как первое действие внутри неявного цикла while, созданного опциями "-n" или "-p".

perl -ane 'print pop(@F), "\n";'

эквивалентно

while (<>) {
    @F = split(' ');
    print pop(@F), "\n";
}

Альтернативный разделитель можно указать с помощью -F.

-a неявным образом устанавливает "-n".

-C [number/list]

Флаг -C управляет некоторыми функциями Perl Юникода.

Начиная с версии 5.8.1, -C может следовать за числом или списком символов опций. Символы, их числовые значения и эффекты представлены ниже; перечисление символов равно сумме чисел.

I     1   STDIN is assumed to be in UTF-8
O     2   STDOUT will be in UTF-8
E     4   STDERR will be in UTF-8
S     7   I + O + E
i     8   UTF-8 is the default PerlIO layer for input streams
o    16   UTF-8 is the default PerlIO layer for output streams
D    24   i + o
A    32   the @ARGV elements are expected to be strings encoded
          in UTF-8
L    64   normally the "IOEioA" are unconditional, the L makes
          them conditional on the locale environment variables
          (the LC_ALL, LC_CTYPE, and LANG, in the order of
          decreasing precedence) -- if the variables indicate
          UTF-8, then the selected "IOEioA" are in effect
a   256   Set ${^UTF8CACHE} to -1, to run the UTF-8 caching
          code in debugging mode.

Например, -COE и -C6 оба включат UTF-8 для STDOUT и STDERR. Повторные символы просто избыточны, не являются кумулятивными и не переключаются.

Опции io означают, что любые последующие open() (или аналогичные операции ввода/вывода) в основном пространстве программы будут иметь :utf8 слой PerlIO неявным образом, другими словами, ожидается UTF-8 от любого входного потока и генерируется UTF-8 в любой выходной поток. Это просто значение по умолчанию, установленное через ${^OPEN}, с явными слоями в open() и с binmode() можно управлять потоками как обычно. Это не влияет на код, выполняемый в модулях.

-C сам по себе (без последующего числа или списка опций) или пустая строка "" для переменной окружения "PERL_UNICODE" имеет тот же эффект, что и -CSDL. Другими словами, стандартные потоки ввода/вывода и слой по умолчанию open() становятся UTF-8, но только если переменные окружения локали указывают на локаль UTF-8. Это поведение соответствует неявному (и проблематичному) поведению UTF-8 в Perl 5.8.0. (См. "UTF-8 no longer default under UTF-8 locales" в perl581delta.)

Вы можете использовать -C0 (или "0" для PERL_UNICODE) для явного отключения всех вышеупомянутых функций Юникода.

Чтение-только магическая переменная ${^UNICODE} отражает числовое значение этого параметра. Эта переменная устанавливается во время запуска Perl и после этого является только для чтения. Если вам нужны эффекты во время выполнения, используйте открытие с тремя аргументами (см. "open" в perlfunc), с двумя аргументами binmode() (см. "binmode" в perlfunc) и open pragma (см. open).

(В Perl-версиях, предшествующих 5.8.1, переключатель -C был переключателем только для Win32, который позволял использовать Unicode-совместимые Win32-API «широких системных вызовов». Однако эта функция практически не использовалась, и поэтому переключатель командной строки был «переработан».)

Примечание: Начиная с perl 5.10.1, если опция -C используется в строке #! , она должна быть указана в командной строке также, так как стандартные потоки уже настроены на этом этапе выполнения интерпретатора Perl. Вы также можете использовать binmode() для установки кодировки потока ввода/вывода.

-c

заставляет Perl проверить синтаксис программы, а затем выйти, не выполняя её. Фактически, он будет выполнять любые BEGIN, UNITCHECK, или CHECK блоки и любые use операторы: они рассматриваются как происходящие вне выполнения вашей программы. INIT и END блоки, однако, будут пропущены.

-d
-dt

выполняет программу под отладчиком Perl. См. perldebug. Если указан t, это указывает отладчику, что в отлаживаемом коде будут использоваться потоки.

-d:MOD[=bar,baz]
-dt:MOD[=bar,baz]

выполняет программу под управлением модуля отладки, профилирования или трассировки, установленного как Devel::MOD. Например, -d:DProf выполняет программу с помощью профилировщика Devel::DProf. Как и со флагом -M, опции могут передаваться в пакет Devel::MOD, где они будут приняты и интерпретированы процедурой Devel::MOD::import. Опять же, как и со флагом -M, используйте --d:-MOD для вызова Devel::MOD::unimport вместо import. Список опций, разделённых запятыми, должен следовать за символом =. Если указан t, это указывает отладчику, что в отлаживаемом коде будут использоваться потоки. См. perldebug.

-Dletters
-Dnumber

устанавливает флаги отладки. Этот переключатель включён только в том случае, если ваш Perl-бинарник был собран с включённой отладкой: в обычных производственных версиях Perl его не будет.

Например, чтобы наблюдать за выполнением вашей программы Perl, используйте -Dtls. Ещё одна полезная опция - -Dx, которая выводит скомпилированное синтаксическое дерево, и -Dr отображает скомпилированные регулярные выражения; формат вывода описан в perldebguts.

В качестве альтернативы, укажите число вместо списка букв (например, -D14 эквивалентно -Dtls):

        1  p  Tokenizing and parsing (with v, displays parse
              stack)
        2  s  Stack snapshots (with v, displays all stacks)
        4  l  Context (loop) stack processing
        8  t  Trace execution
       16  o  Method and overloading resolution
       32  c  String/numeric conversions
       64  P  Print profiling info, source file input state
      128  m  Memory and SV allocation
      256  f  Format processing
      512  r  Regular expression parsing and execution
     1024  x  Syntax tree dump
     2048  u  Tainting checks
     4096  U  Unofficial, User hacking (reserved for private,
              unreleased use)
    16384  X  Scratchpad allocation
    32768  D  Cleaning up
    65536  S  Op slab allocation
   131072  T  Tokenizing
   262144  R  Include reference counts of dumped variables
              (eg when using -Ds)
   524288  J  show s,t,P-debug (don't Jump over) on opcodes within
              package DB
  1048576  v  Verbose: use in conjunction with other flags to
              increase the verbosity of the output.  Is a no-op on
              many of the other flags
  2097152  C  Copy On Write
  4194304  A  Consistency checks on internal structures
  8388608  q  quiet - currently only suppresses the "EXECUTING"
              message
 16777216  M  trace smart match resolution
 33554432  B  dump suBroutine definitions, including special
              Blocks like BEGIN
 67108864  L  trace Locale-related info; what gets output is very
              subject to change
134217728  i  trace PerlIO layer processing.  Set PERLIO_DEBUG to
              the filename to trace to.
268435456  y  trace y///, tr/// compilation and execution

Все эти флаги требуют -DDEBUGGING при компиляции исполняемого файла Perl (но см. :opd в Devel::Peek или "'debug' mode" в re, которые могут это изменить). См. файл INSTALL в исходном дистрибутиве Perl, как это сделать.

Если вы просто пытаетесь получить вывод каждой строки Perl-кода по мере её выполнения, так, как sh -x предоставляет для shell-скриптов, вы не можете использовать переключатель -D Perl. Вместо этого сделайте так

# If you have "env" utility
env PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program

# Bourne shell syntax
$ PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program

# csh syntax
% (setenv PERLDB_OPTS "NonStop=1 AutoTrace=1 frame=2"; perl -dS program)

См. perldebug для получения подробной информации и вариантов.

-e commandline

может быть использован для ввода одной строки программы. Если задан -e, Perl не будет искать имя файла в списке аргументов. Можно задавать несколько команд -e, чтобы построить многострочный скрипт. Не забудьте использовать точки с запятой там, где вы бы использовали их в обычной программе.

-E commandline

ведет себя точно так же, как -e, за исключением того, что он неявно включает все дополнительные возможности (в основном модуле компиляции). См. feature.

-f

Отключает выполнение $Config{sitelib}/sitecustomize.pl при запуске.

Perl может быть скомпилирован таким образом, что по умолчанию будет пытаться выполнить $Config{sitelib}/sitecustomize.pl при запуске (в блоке BEGIN). Это крючок, который позволяет системному администратору настроить поведение Perl. Например, его можно использовать для добавления записей в массив @INC, чтобы Perl находил модули в нестандартных расположениях.

Perl фактически вставляет следующий код:

BEGIN {
    do { local $!; -f "$Config{sitelib}/sitecustomize.pl"; }
        && do "$Config{sitelib}/sitecustomize.pl";
}

Поскольку это фактическая do (а не require), sitecustomize.pl не нужно возвращать истинное значение. Код выполняется в пакете main, в своём собственном лексическом пространстве. Однако, если скрипт завершится ошибкой, $@ не будет установлено.

Значение $Config{sitelib} также определяется в коде C и не считывается из Config.pm, который не загружается.

Код выполняется очень рано. Например, любые изменения, внесённые в @INC, будут отображаться в выводе `perl -V`. Конечно, END блоки будут так же выполняться очень поздно.

Чтобы определить во время выполнения, включена ли эта возможность в ваш Perl, вы можете проверить значение $Config{usesitecustomize}.

-Fpattern

устанавливает шаблон для разделения при использовании "-a". Шаблон может быть заключён в //, "", или '', в противном случае он будет помещён в одинарные кавычки. В шаблоне нельзя использовать пробелы или символы NUL.

-F неявным образом устанавливает как "-a", так и "-n".

-h

выводит сводку по опциям.

-i[extension]

указывает, что файлы, обработанные конструкцией <>, должны быть отредактированы на месте. Это делается путём переименования входного файла, открытия выходного файла с исходным именем и выбора этого выходного файла в качестве значения по умолчанию для оператора print(). Расширение, если оно предоставлено, используется для изменения имени старого файла, чтобы сделать резервную копию, следуя этим правилам:

Если расширение не указано, и ваша система его поддерживает, исходный файл остаётся открытым без имени, в то время как вывод перенаправляется в новый файл с исходным именем файла. При завершении perl, вне зависимости от того, как это происходит, исходный файл удаляется из системы.

Если расширение не содержит *, оно добавляется в конец текущего имени файла в качестве суффикса. Если расширение содержит один или несколько символов *, каждый символ * заменяется текущим именем файла. В терминах Perl, вы можете представить это как:

($backup = $extension) =~ s/\*/$file_name/g;

Это позволяет добавить префикс к резервному файлу вместо (или в дополнение к) суффиксу:

$ perl -pi'orig_*' -e 's/bar/baz/' fileA  # backup to
                                          # 'orig_fileA'

Или даже поместить резервные копии исходных файлов в другой каталог (при условии, что каталог уже существует):

$ perl -pi'old/*.orig' -e 's/bar/baz/' fileA  # backup to
                                              # 'old/fileA.orig'

Эти наборы однострочных команд эквивалентны:

$ perl -pi -e 's/bar/baz/' fileA          # overwrite current file
$ perl -pi'*' -e 's/bar/baz/' fileA       # overwrite current file

$ perl -pi'.orig' -e 's/bar/baz/' fileA   # backup to 'fileA.orig'
$ perl -pi'*.orig' -e 's/bar/baz/' fileA  # backup to 'fileA.orig'

В командной строке, выполнение

$ perl -p -i.orig -e "s/foo/bar/; ... "

эквивалентно выполнению программы:

#!/usr/bin/perl -pi.orig
s/foo/bar/;

что эквивалентно

#!/usr/bin/perl
$extension = '.orig';
LINE: while (<>) {
    if ($ARGV ne $oldargv) {
        if ($extension !~ /\*/) {
            $backup = $ARGV . $extension;
        }
        else {
            ($backup = $extension) =~ s/\*/$ARGV/g;
        }
        rename($ARGV, $backup);
        open(ARGVOUT, ">$ARGV");
        select(ARGVOUT);
        $oldargv = $ARGV;
    }
    s/foo/bar/;
}
continue {
    print;  # this prints to original filename
}
select(STDOUT);

за исключением того, что форма -i не нуждается в сравнении $ARGV с $oldargv, чтобы узнать, когда имя файла изменилось. Однако она использует ARGVOUT для выбранного дескриптора файла. Обратите внимание, что STDOUT восстанавливается в качестве дескриптора выходного файла по умолчанию после цикла.

Как показано выше, Perl создаёт резервный файл независимо от того, были ли фактически изменены какие-либо данные. Таким образом, это просто изящный способ копирования файлов:

    $ perl -p -i'/some/file/path/*' -e 1 file1 file2 file3...
or
    $ perl -p -i'.orig' -e 1 file1 file2 file3...

Вы можете использовать eof без скобок, чтобы найти конец каждого входного файла, если вы хотите добавить данные в каждый файл или сбросить нумерацию строк (см. пример в "eof" в perlfunc).

Если для данного файла Perl не может создать резервный файл, как указано в расширении, он пропустит этот файл и перейдёт к следующему (если он существует).

Для обсуждения проблем, связанных с правами доступа к файлам и -i, см. "Почему Perl позволяет мне удалять файлы только для чтения? Почему -i перезаписывает защищённые файлы? Разве это ошибка в Perl?" в perlfaq5.

Вы не можете использовать -i для создания каталогов или удаления расширений файлов.

Perl не расширяет ~ в именах файлов, что хорошо, так как некоторые люди используют его для своих резервных файлов:

$ perl -pi~ -e 's/foo/bar/' file1 file2 file3...

Обратите внимание, что поскольку -i переименовывает или удаляет исходный файл перед созданием нового файла с тем же именем, Unix-стилевые мягкие и жёсткие ссылки не будут сохранены.

Наконец, переключатель -i не препятствует выполнению, когда в командной строке не заданы файлы. В этом случае резервная копия не создаётся (исходный файл, конечно, определить нельзя), и обработка происходит от STDIN к STDOUT, как ожидалось.

-Iкаталог

Каталоги, указанные с помощью -I, добавляются в начало пути поиска модулей (@INC).

-l[восьмеричное число]

включает автоматическую обработку окончания строк. Она имеет два отдельных эффекта. Во-первых, она автоматически удаляет $/ (разделитель записей ввода) при использовании с "-n" или "-p". Во-вторых, она задаёт $\ (разделитель записей вывода) значение восьмеричное число, чтобы любые операторы print имели этот разделитель. Если восьмеричное число опущено, устанавливает $\ на текущее значение $/. Например, чтобы обрезать строки до 80 символов:

perl -lpe 'substr($_, 80) = ""'

Обратите внимание, что присвоение $\ = $/ выполняется при обработке переключателя, поэтому разделитель записей ввода может отличаться от разделителя записей вывода, если переключатель -l следует за переключателем -0:

gnufind / -print0 | perl -ln0e 'print "found $_" if -p'

Это устанавливает $\ на символ новой строки, а затем устанавливает $/ на нулевой символ.

-m[-]модуль
-M[-]модуль
-M[-]'модуль ...'
-[mM][-]модуль=арг[,арг]...

-mмодуль выполняет use модуль (); перед выполнением вашей программы. Это загружает модуль, но не вызывает его метод import, поэтому не импортирует подпрограммы и не оказывает влияния на пragma.

-Mмодуль выполняет use модуль ; перед выполнением вашей программы. Это загружает модуль и вызывает его метод import, вызывая у модуля его стандартный эффект, обычно импортируя подпрограммы или оказывая влияние на пragma. Вы можете использовать кавычки для добавления дополнительного кода после имени модуля, например, '-MMODULE qw(foo bar)'.

Если первый символ после -M или -m является тире (-), то 'use' заменяется на 'no'. Это не имеет значения для -m.

Небольшая встроенная синтаксическая поддержка означает, что вы также можете сказать -mМОДУЛЬ=foo,bar или -MМОДУЛЬ=foo,bar в качестве сокращения для '-MМОДУЛЬ qw(foo bar)'. Это позволяет избежать необходимости использовать кавычки при импорте символов. Фактический код, сгенерированный -MМОДУЛЬ=foo,bar, выглядит следующим образом: use module split(/,/,q{foo,bar}). Обратите внимание, что форма = устраняет различие между -m и -M; то есть, -mМОДУЛЬ=foo,bar эквивалентно -MМОДУЛЬ=foo,bar.

Следствие формулировки split заключается в том, что -MМОДУЛЬ=число никогда не выполняет проверку версии, если только MODULE::import() сам не настроен на проверку версии, что может произойти, например, если МОДУЛЬ унаследован от Exporter.

-n

принуждает Perl предположить следующий цикл вокруг вашей программы, что заставляет её итерироваться по аргументам имени файла примерно как sed -n или awk:

LINE:
  while (<>) {
      ...             # your program goes here
  }

Обратите внимание, что строки не выводятся по умолчанию. См. "-p", чтобы строки выводились. Если файл, указанный аргументом, не может быть открыт по какой-либо причине, Perl выдаёт предупреждение и переходит к следующему файлу.

Также обратите внимание, что <> передаёт аргументы командной строки в "open" в perlfunc, которые не обязательно интерпретируются как имена файлов. См. perlop для возможных последствий для безопасности.

Вот эффективный способ удаления всех файлов, которые не были изменены не менее недели назад:

find . -mtime +7 -print | perl -nle unlink

Это быстрее, чем использование переключателя -exec у find, потому что вам не нужно запускать процесс для каждого найденного имени файла (но это не быстрее, чем использование переключателя -delete, доступного в более новых версиях find. Это страдает от ошибки неправильной обработки символов новой строки в именах путей, которую можно исправить, если вы следуете примеру в разделе -0.

BEGIN и END блоки могут использоваться для захвата управления до или после неявного цикла программы, как и в awk.

-p

принуждает Perl предположить следующий цикл вокруг вашей программы, что заставляет её итерироваться по аргументам имени файла примерно как sed:

LINE:
  while (<>) {
      ...             # your program goes here
  } continue {
      print or die "-p destination: $!\n";
  }

Если файл, указанный аргументом, не может быть открыт по какой-либо причине, Perl выдаёт предупреждение и переходит к следующему файлу. Обратите внимание, что строки выводятся автоматически. Возникновение ошибки во время вывода рассматривается как фатальная. Чтобы подавить вывод, используйте переключатель "-n". -p переопределяет переключатель -n.

BEGIN и END блоки могут использоваться для захвата управления до или после неявного цикла, как и в awk.

-s

включает рудиментарную обработку переключателей для переключателей в командной строке после имени программы, но перед любыми аргументами имени файла (или перед аргументом --). Любой найденный переключатель удаляется из @ARGV и устанавливает соответствующую переменную в программе Perl. Следующая программа выводит "1", если программа вызвана с переключателем -xyz, и "abc", если она вызвана с -xyz=abc.

#!/usr/bin/perl -s
if ($xyz) { print "$xyz\n" }

Обратите внимание, что такой переключатель, как --help, создаёт переменную ${-help}, что не соответствует use strict "refs". Кроме того, при использовании этого параметра в скрипте с включёнными предупреждениями вы можете получить множество ложных предупреждений "используется только один раз".

-S

заставляет Perl использовать переменную окружения "PATH" для поиска программы, если имя программы не содержит разделителей пути.

На некоторых платформах это также заставляет Perl добавлять суффиксы к имени файла при поиске. Например, на платформах Win32 добавляются суффиксы ".bat" и ".cmd", если поиск исходного имени не удался, и если имя не заканчивается на одном из этих суффиксов. Если Perl был скомпилирован с включённым DEBUGGING, использование переключателя -Dp в Perl покажет, как происходит поиск.

Обычно это используется для эмуляции #! запуска на платформах, которые не поддерживают #!. Это также удобно при отладке скрипта, использующего #!, и поэтому обычно находится механизмом поиска $PATH оболочки.

Этот пример работает на многих платформах, имеющих оболочку, совместимую с оболочкой Bourne:

#!/usr/bin/perl
eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}'
        if 0; # ^ Run only under a shell

Система игнорирует первую строку и передает программу в /bin/sh, который пытается выполнить программу Perl как скрипт оболочки. Оболочка выполняет вторую строку как обычную команду оболочки и, таким образом, запускает интерпретатор Perl. На некоторых системах $0 не всегда содержит полный путь, поэтому "-S" сообщает Perl о необходимости поиска программы при необходимости. После того, как Perl найдёт программу, он проанализирует строки и проигнорирует их, потому что проверка 'if 0' никогда не верна. Если программа будет интерпретироваться csh, вам нужно заменить ${1+"$@"} на $*, даже несмотря на то, что она не понимает вложенных пробелов (и т.п.) в списке аргументов. Чтобы запустить sh вместо csh, на некоторых системах может потребоваться заменить строку #! строкой только с двоеточием, которая будет вежливо проигнорирована Perl. Другие системы не могут этого контролировать и нуждаются в совершенно хитроумном конструкте, который будет работать под csh, sh или Perl, например, в следующем:

eval '(exit $?0)' && eval 'exec perl -wS $0 ${1+"$@"}'
& eval 'exec /usr/bin/perl -wS $0 $argv:q'
        if 0; # ^ Run only under a shell

Если имя файла содержит разделители каталогов (и, следовательно, является абсолютным или относительным путем), и если этот файл не найден, платформы, добавляющие расширения файлов, сделают это и попытаются найти файл с добавленными расширениями по одному.

На платформах, подобных DOS, если программа не содержит разделителей каталогов, она сначала будет найдена в текущем каталоге, прежде чем будет найдена в PATH. На Unix-платформах программа будет искаться строго в PATH.

-t

Как "-T", но проверки целостности будут выдавать предупреждения, а не фатальные ошибки. Теперь эти предупреждения можно контролировать обычным способом с помощью no warnings qw(taint).

Примечание: это не замена -T! Это предназначено только для временной помощи в разработке при обеспечении безопасности устаревшего кода: для реального кода производства и для нового безопасного кода, написанного с нуля, всегда используйте реальный "-T".

-T

включает "загрязнение", чтобы вы могли их протестировать. Обычно эти проверки выполняются только при выполнении setuid или setgid. Хорошей идеей является явное включение их для программ, которые выполняются от имени другого человека, которому вы, возможно, не доверяете, например, CGI-программ или любых интернет-серверов, которые вы можете написать на Perl. Подробности см. в perlsec. По соображениям безопасности этот параметр должен быть воспринят Perl достаточно рано; обычно это означает, что он должен появляться в начале командной строки или в строке #! для систем, которые поддерживают этот конструкт.

-u

Этот переключатель заставляет Perl сбрасывать ядро после компиляции вашей программы. Затем вы теоретически можете взять этот дамп ядра и преобразовать его в исполняемый файл с помощью программы undump (не поставляется). Это ускоряет запуск в ущерб некоторому объёму дискового пространства (которое можно минимизировать, удалив исполняемый файл). (Тем не менее, исполняемый файл "hello world" занимает примерно 200 КБ на моём компьютере). Если вы хотите выполнить часть своей программы перед сбросом, используйте функцию CORE::dump(). Примечание: наличие undump зависит от платформы и может отсутствовать для определённых портов Perl.

-U

позволяет Perl выполнять небезопасные операции. В настоящее время единственными "небезопасными" операциями являются попытка удаления каталогов при выполнении как суперпользователь и запуск программ setuid с фатальными проверками целостности, преобразованными в предупреждения. Обратите внимание, что предупреждения должны быть включены вместе с этим параметром, чтобы фактически выводить предупреждения о проверке целостности.

-v

выводит версию и номер сервисной модификации вашего исполняемого файла perl.

-V

выводит сводку основных конфигурационных значений perl и текущих значений @INC.

-V:configvar

Выводит в стандартный вывод значение(я) указанной конфигурационной переменной(ых), с множественными значениями, когда ваш аргумент configvar выглядит как регулярное выражение (содержит небуквенные символы). Например:

$ perl -V:libc
    libc='/lib/libc-2.2.4.so';
$ perl -V:lib.
    libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc';
    libc='/lib/libc-2.2.4.so';
$ perl -V:lib.*
    libpth='/usr/local/lib /lib /usr/lib';
    libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc';
    lib_ext='.a';
    libc='/lib/libc-2.2.4.so';
    libperl='libperl.a';
    ....

Кроме того, дополнительные двоеточия могут использоваться для управления форматированием. Конечный двоеточие подавляет перевод строки и разделитель ";", позволяя вам встраивать запросы в командные строки. (мнемоника: разделитель PATH ":").

$ echo "compression-vars: " `perl -V:z.*: ` " are here !"
compression-vars:  zcat='' zip='zip'  are here !

Ведущее двоеточие удаляет часть "name=" из ответа, это позволяет вам сопоставить нужные имена. (мнемоника: пустая метка)

$ echo "goodvfork="`./perl -Ilib -V::usevfork`
goodvfork=false;

Ведущие и конечные двоеточия могут использоваться вместе, если вам нужны значения позиционных параметров без имён. Обратите внимание, что в приведённом ниже примере параметры PERL_API возвращаются в алфавитном порядке.

$ echo building_on `perl -V::osname: -V::PERL_API_.*:` now
building_on 'linux' '5' '1' '9' now
-w

выводит предупреждения о сомнительных конструкциях, таких как имена переменных, упомянутых только один раз, скалярные переменные, используемые до присвоения им значения, переопределенные подпрограммы, ссылки на неопределённые файловые дескрипторы, файловые дескрипторы, открытые только для чтения, по которым вы пытаетесь писать, значения, используемые как число, которые не выглядят как числа, использование массива как скаляра; если ваши подпрограммы рекурсируют более 100 раз; и бесчисленные другие вещи.

Этот переключатель фактически просто включает глобальную переменную $^W; обычно предпочтительнее использовать лексически ограниченный псевдоним use warnings. Вы можете отключить или преобразовать определённые предупреждения в фатальные ошибки, используя обработчики __WARN__, как описано в perlvar и "warn" в perlfunc. См. также perldiag и perltrap. Также доступна система предупреждений с тонкими настройками, если вы хотите управлять целыми классами предупреждений; см. warnings.

-W

Включает все предупреждения независимо от no warnings или $^W. См. warnings.

-X

Отключает все предупреждения независимо от use warnings или $^W. См. warnings.

Запрещено в "PERL5OPT".

-x
-xdirectory

сообщает Perl, что программа встроена в более крупный фрагмент не связанного текста, например, в сообщении по электронной почте. Лишние данные будут отбрасываться до первой строки, начинающейся с #! и содержащей строку "perl". Любые значимые переключатели в этой строке будут применены.

Все ссылки на номера строк в программе (предупреждения, ошибки и т. д.) будут рассматривать строку #! как первую строку. Таким образом, предупреждение на второй строке программы, которая находится на 100-й строке в файле, будет сообщено как строка 2, а не как строка 100. Это можно переопределить, используя директиву #line. (См. "Простые старые комментарии (Не!)" в perlsyn)

Если указано имя каталога, Perl переключится на этот каталог перед запуском программы. Переключатель -x управляет только обработкой вводных мусорных данных. Программа должна завершаться с помощью __END__, если есть отбрасываемые хвостовые мусорные данные; программа может обрабатывать любые или все хвостовые мусорные данные через файловый дескриптор DATA при необходимости.

Если указан каталог, он должен следовать непосредственно за переключателем -x без промежутков.

Окружение

HOME

Используется, если chdir не имеет аргумента.

LOGDIR

Используется, если chdir не имеет аргумента и "HOME" не задан.

PATH

Используется при выполнении дочерних процессов и поиске программы, если используется "-S".

PERL5LIB

Список каталогов, в которых следует искать файлы библиотек Perl перед поиском в стандартной библиотеке. Любые зависящие от архитектуры и версии каталоги, такие как version/archname/, version/ или archname/ в указанных расположениях, автоматически включаются, если они существуют, и этот поиск выполняется при запуске интерпретатора. Кроме того, добавляются любые каталоги, соответствующие записям в $Config{inc_version_list}. (Обычно это каталоги для устаревших совместимых версий perl, установленных в той же иерархии каталогов.)

Если PERL5LIB не определён, используется "PERLLIB". Каталоги разделяются (как в PATH) двоеточием в системах Unix и точкой с запятой в Windows (используемый разделитель путей задаётся командой perl -V:path_sep).

При выполнении проверок целостности (либо потому, что программа выполнялась с правами setuid или setgid, либо из-за указания переключателей "-T" или "-t"), переменные PERL5LIB и "PERLLIB" не учитываются. Программа должна вместо этого сказать:

use lib "/my/directory";
PERL5OPT

Параметры командной строки (переключатели). Переключатели в этой переменной обрабатываются так, как будто они присутствуют в каждой командной строке Perl. Допускаются только переключатели -[CDIMTUWdmtw]. При выполнении проверок целостности (либо потому, что программа выполнялась с правами setuid или setgid, либо из-за использования переключателя "-T" или "-t"), эта переменная игнорируется. Если PERL5OPT начинается с -T, включение проверки целостности происходит, и последующие параметры игнорируются. Если PERL5OPT начинается с -t, включение проверки целостности происходит, а записываемый символ точки удаляется из @INC, и последующие параметры учитываются.

PERLIO

Список слоёв PerlIO, разделённый пробелами (или двоеточиями). Если Perl был скомпилирован с использованием системы PerlIO для ввода-вывода (по умолчанию), эти слои влияют на ввод-вывод Perl.

Обычно имена слоёв начинаются с двоеточия (например, :perlio) для акцентирования их сходства с «атрибутами» переменных. Однако код, анализирующий строки спецификаций слоёв, используемый также для декодирования переменной среды PERLIO, рассматривает двоеточие как разделитель.

Неопределённое или пустое значение PERLIO эквивалентно набору слоёв по умолчанию для вашей платформы; например, :unix:perlio в системах Unix и :unix:crlf в Windows и других системах DOS.

Список становится значением по умолчанию для всех операций ввода-вывода Perl. Следовательно, в этом списке могут появляться только встроенные слои, так как внешние слои (например, :encoding()) нуждаются в вводе-выводе для их загрузки! См. "pragma open" для того, как добавить внешние кодировки в качестве значений по умолчанию.

Ниже кратко обобщены слои, которые целесообразно включить в переменную среды PERLIO. Более подробную информацию см. в PerlIO.

:crlf

Слой, который выполняет преобразование CRLF в "\n" перевод, различая текстовые и двоичные файлы в стиле MS-DOS и подобных операционных систем, а также обеспечивает буферизацию, аналогичную :perlio на этих архитектурах.

:perlio

Это повторная реализация буферизации в стиле stdio, написанная как слой PerlIO. Таким образом, он будет вызывать любой слой под ним для своих операций, обычно :unix.

:stdio

Этот слой предоставляет интерфейс PerlIO, оборачивая системные вызовы ANSI C «stdio». Слой обеспечивает как буферизацию, так и ввод-вывод. Обратите внимание, что слой :stdio не выполняет перевод CRLF, даже если это стандартное поведение платформы. Вам понадобится слой :crlf над ним для этого.

:unix

Базовый слой, который вызывает read, write, lseek, и т. д.

:win32

В системах Win32 этот экспериментальный слой использует родной ввод-вывод «handle» вместо слоя числового дескриптора файла, аналогичного Unix. Известно, что он имеет ошибки в этом выпуске (5.30).

Набор слоёв по умолчанию должен давать приемлемые результаты на всех платформах.

Для платформ Unix это эквивалентно ":unix:perlio" или ":stdio". Настройка настроена на предпочтение реализации ":stdio", если системная библиотека обеспечивает быстрый доступ к буферу (не часто встречается на современных архитектурах); в противном случае используется реализация ":unix:perlio".

В Windows в этом выпуске (5.30) значение по умолчанию — ":unix:crlf". В ":stdio" Win32 есть ряд ошибок/неправильных функций для ввода-вывода Perl, которые в некоторой степени зависят от версии и поставщика компилятора C. Использование собственного :crlf слоя в качестве буфера позволяет избежать этих проблем и сделать вещи более унифицированными.

В этом выпуске (5.30) используется :unix как нижний слой в Windows, поэтому по-прежнему используются числовые дескрипторы файлов компилятора C. Существует экспериментальный родной :win32 слой, который, как ожидается, будет улучшен и, возможно, в конечном итоге станет значением по умолчанию в Windows.

Переменная среды PERLIO полностью игнорируется при запуске Perl в режиме проверки целостности.

PERLIO_DEBUG

Если при запуске Perl с переключателем командной строки -Di устанавливается имя файла или устройства, регистрация определённых операций подсистемы PerlIO перенаправляется в указанный файл, а не в stderr, что является значением по умолчанию. Файл открывается в режиме добавления. Типичные случаи использования в Unix:

% env PERLIO_DEBUG=/tmp/perlio.log perl -Di script ...

и приблизительно эквивалентные в Windows:

> set PERLIO_DEBUG=CON
perl -Di script ...

Эта функциональность отключена для скриптов с правами setuid, для скриптов, запущенных с "-T", и для скриптов, запущенных на Perl, скомпилированном без поддержки -DDEBUGGING.

PERLLIB

Список каталогов, в которых следует искать файлы библиотек Perl перед поиском в стандартной библиотеке. Если определена "PERL5LIB", PERLLIB не используется.

Переменная среды PERLLIB полностью игнорируется при запуске Perl в режиме проверки целостности.

PERL5DB

Команда, используемая для загрузки кода отладчика. По умолчанию:

BEGIN { require "perl5db.pl" }

Переменная среды PERL5DB используется только при запуске Perl со стандартным переключателем "-d".

PERL5DB_THREADED

Если установлено значение «истина», отладчику сообщается, что отлаживаемый код использует потоки.

PERL5SHELL (специфично для порта Win32)

Только для портов Win32, может быть установлено альтернативное оболочку, которую Perl должен использовать для выполнения команд «backtick» или system(). Значение по умолчанию — cmd.exe /x/d/c в WindowsNT и command.com /c в Windows95. Значение рассматривается как разделённое пробелами. Заменяйте любой символ, требующий защиты, например пробел или обратный слэш, другим обратным слэшем.

Обратите внимание, что Perl не использует COMSPEC для этой цели, поскольку COMSPEC имеет высокую степень вариативности среди пользователей, что вызывает проблемы с переносимостью. Кроме того, Perl может использовать оболочку, которая может не подходить для интерактивного использования, а установка COMSPEC на такую оболочку может помешать правильной работе других программ (которые обычно ищут COMSPEC для поиска оболочки, подходящей для интерактивного использования).

До Perl 5.10.0 и 5.8.8 PERL5SHELL не проверялся на целостность при выполнении внешних команд. Рекомендуется явно задавать (или удалять) $ENV{PERL5SHELL} при запуске в режиме проверки целостности в Windows.

PERL_ALLOW_NON_IFS_LSP (специфично для порта Win32)

Установите в 1, чтобы разрешить использование LSP (Layered Service Providers), несовместимых с IFS. Perl обычно ищет LSP, совместимый с IFS, поскольку это требуется для эмуляции Windows-сокеттов как реальных файловых дескрипторов. Однако это может вызвать проблемы, если у вас есть брандмауэр, например, McAfee Guardian, который требует, чтобы все приложения использовали его LSP, но который несовместим с IFS, поскольку очевидно, что Perl обычно избегает использования такого LSP.

Установка этой переменной среды в 1 означает, что Perl просто использует первый подходящий LSP, перечисленный в каталоге, что делает McAfee Guardian счастливым — и в этом конкретном случае Perl всё ещё работает, потому что McAfee Guardian на самом деле выполняет другие действия, которые позволяют работать приложениям, требующим совместимости с IFS.

PERL_DEBUG_MSTATS

Актуально только если Perl был скомпилирован с включённым malloc из дистрибутива Perl, то есть, если perl -V:d_mymalloc имеет значение «define».

При установке выводится статистика памяти после выполнения. При установке в целое число большее, чем один, также выводится статистика памяти после компиляции.

PERL_DESTRUCT_LEVEL

Управляет поведением глобального уничтожения объектов и других ссылок. См. "PERL_DESTRUCT_LEVEL" в perlhacktips для получения дополнительной информации.

PERL_DL_NONLAZY

Установите в "1", чтобы Perl разрешал все неопределённые символы при загрузке динамической библиотеки. По умолчанию символы разрешаются при использовании. Установка этой переменной полезна при тестировании расширений, так как она гарантирует, что вы получите ошибку при неправильном написании имён функций, даже если набор тестов их не вызывает.

PERL_ENCODING

Если используется pragma use encoding, не указав явно имя кодировки, проверяется переменная среды PERL_ENCODING для получения имени кодировки.

PERL_HASH_SEED

(С Perl 5.8.1, новые семантики в Perl 5.18.0) Используется для переопределения случайного характера внутренней хеш-функции Perl. Значение выражается в шестнадцатеричном формате и может содержать префикс 0x. Обрезаемые шаблоны обрабатываются так, как будто они дополнены необходимым количеством нулей.

Если этот параметр предоставлен, и PERL_PERTURB_KEYS НЕ установлено, то значение '0' подразумевает PERL_PERTURB_KEYS=0, а любое другое значение подразумевает PERL_PERTURB_KEYS=2.

ВАЖНО: Хеш-семя — это конфиденциальная информация. Хеши случайны, чтобы защитить от локальных и удалённых атак на код Perl. Ручное задание семени может частично или полностью лишить эту защиту.

См. "Algorithmic Complexity Attacks" в perlsec, "PERL_PERTURB_KEYS" и "PERL_HASH_SEED_DEBUG" для получения дополнительной информации.

PERL_PERTURB_KEYS

(С Perl 5.18.0) Установите значение в "0" или "NO", затем обход ключей будет повторяемым при каждом запуске для одного и того же PERL_HASH_SEED. Вставка в хеш не изменит порядок, за исключением предоставления большего пространства в хеше. В сочетании с установкой PERL_HASH_SEED этот режим максимально приближен к поведению до версии 5.18.

Если установлено значение "1" или "RANDOM", тогда обход ключей будет случайным. Каждый раз, когда хеш вставляется в порядок ключей, он изменяется случайным образом. Порядок может быть не воспроизводимым при последующем запуске программы, даже если PERL_HASH_SEED был задан. Это — режим по умолчанию для Perl.

Если установлено значение "2" или "DETERMINISTIC", то вставка ключей в хеш приведет к изменению порядка ключей, но таким образом, что это будет воспроизводимым от одного запуска программы к другому.

ПРИМЕЧАНИЕ: Использование этого параметра считается небезопасным и предназначено только для отладки недетерминированного поведения функции хеширования Perl. Не используйте его в рабочей среде.

См. "Атаки на сложность алгоритма" в perlsec и "PERL_HASH_SEED" и "PERL_HASH_SEED_DEBUG" для получения дополнительной информации. Вы можете получить и установить маску обхода ключей для определенного хеша, используя функцию hash_traversal_mask() из Hash::Util.

PERL_HASH_SEED_DEBUG

(С Perl 5.8.1.) Установите значение в "1", чтобы отобразить (в STDERR) информацию о функции хеширования, зерне и типе случайной перестановки ключей, действующих в начале выполнения. Это, в сочетании с "PERL_HASH_SEED" и "PERL_PERTURB_KEYS", предназначено для помощи в отладке недетерминированного поведения, вызванного случайной перестановкой хешей.

Обратите внимание, что любая информация о функции хеширования, особенно зерно хеша, является конфиденциальной информацией: зная её, можно организовать атаку отказа в обслуживании против кода Perl, даже удалённо; см. "Атаки на сложность алгоритма" в perlsec для получения дополнительной информации. Не раскрывайте зерно хеша людям, которым это не нужно. См. также hash_seed() и hash_traversal_mask().

Пример вывода:

HASH_FUNCTION = ONE_AT_A_TIME_HARD HASH_SEED = 0x652e9b9349a7a032 PERTURB_KEYS = 1 (RANDOM)
PERL_MEM_LOG

Если ваш Perl был сконфигурирован с -Accflags=-DPERL_MEM_LOG, установка переменной среды PERL_MEM_LOG включает протоколирование сообщений отладки. Значение имеет вид <number>[m][s][t], где number — номер дескриптора файла, в который вы хотите записывать (2 — по умолчанию), а сочетание букв указывает, какую информацию вы хотите получить (m)emory и/или (s)v, необязательно с (t)imestamps. Например, PERL_MEM_LOG=1mst записывает всю информацию в стандартный вывод. Вы можете записывать в другие открытые дескрипторы файлов различными способами:

$ 3>foo3 PERL_MEM_LOG=3m perl ...
PERL_ROOT (специфично для порта VMS)

Переводящаяся скрыто корневая логическая имя, содержащая Perl и логический прибор для пути @INC только на VMS. Другие логические имена, которые влияют на Perl на VMS, включают PERLSHR, PERL_ENV_TABLES и SYS$TIMEZONE_DIFFERENTIAL, но являются необязательными и обсуждаются далее в perlvms и в README.vms в дистрибутиве Perl.

PERL_SIGNALS

Доступно в Perls 5.8.1 и более поздних версиях. Если установлено значение "unsafe", восстанавливается поведение сигналов до Perl 5.8.0 (которое мгновенное, но небезопасное). Если установлено значение safe, используются безопасные (но отложенные) сигналы. См. "Отложенные сигналы (безопасные сигналы)" в perlipc.

PERL_UNICODE

Эквивалентно параметру командной строки -C. Обратите внимание, что это не булевая переменная. Установка этого значения в "1" не является правильным способом "включения Unicode" (что бы это ни значило). Вы можете использовать "0" для "отключения Unicode" (или, альтернативно, снимите установку PERL_UNICODE в вашей оболочке перед запуском Perl). См. описание параметра -C для получения дополнительной информации.

PERL_USE_UNSAFE_INC

Если perl был сконфигурирован так, что текущая директория по умолчанию не находится в @INC, эта переменная может быть установлена в "1" для её восстановления. Она предназначена в основном для использования во время сборки и тестирования модулей, которые не были обновлены для обработки случая, когда "." отсутствует в @INC, и её не следует устанавливать в среде для повседневного использования.

SYS$LOGIN (специфично для порта VMS)

Используется, если у chdir нет аргумента и "HOME" и "LOGDIR" не установлены.

PERL_INTERNAL_RAND_SEED

Установите значение в неотрицательное целое число, чтобы задать начальное значение генератора случайных чисел, используемого Perl для различных целей.

Игнорируется, если perl запускается с привилегиями setuid или setgid. Используется только для некоторой ограниченной случайной перестановки при запуске (ключей хеша), если -T или -t perl запускается с включённым «загрязнением».

Perl может быть собран так, чтобы игнорировать эту переменную.

Perl также имеет переменные среды, которые контролируют, как Perl обрабатывает данные, специфичные для определённых естественных языков; см. perllocale.

Perl и его различные модули и компоненты, включая его системы тестирования, иногда могут использовать другие переменные среды. Некоторые из них специфичны для определённой платформы. Обратитесь к соответствующей документации по модулям и любой документации для вашей платформы (например, perlsolaris, perllinux, perlmacosx, perlwin32 и т. д.) для переменных, специфичных для этих конкретных ситуаций.

Perl предоставляет доступ ко всем переменным среды исполняемой программе и передаёт их любым запускаемым ей дочерним процессам. Тем не менее, программам, работающим с привилегиями setuid, рекомендуется выполнить следующие строки кода перед выполнением каких-либо действий, чтобы избежать проблем:

$ENV{PATH}  = "/bin:/usr/bin";    # or whatever you need
$ENV{SHELL} = "/bin/sh" if exists $ENV{SHELL};
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};

ПОРЯДОК ПРИМЕНЕНИЯ

Некоторые параметры, в частности -I, -M, PERL5LIB и PERL5OPT могут взаимодействовать, и порядок их применения имеет значение.

Обратите внимание, что этот раздел не документирует, что на самом деле происходит внутри интерпретатора Perl, а документирует, что эффективно происходит.

-I

Эффект нескольких параметров -I заключается в unshift их в @INC справа налево. Например:

perl -I 1 -I 2 -I 3

сначала добавит 3 в начало @INC, затем добавит 2, а затем добавит 1. Результат — @INC начнётся с:

qw(1 2 3)
-M

Несколько параметров -M обрабатываются слева направо. Например:

perl -Mlib=1 -Mlib=2 -Mlib=3

сначала использует прагму lib для добавления 1 в начало @INC, затем добавит 2, затем добавит 3, что приведёт к @INC, начинающемуся с:

qw(3 2 1)
переменная среды PERL5LIB

Она содержит список директорий, разделенных двоеточиями. Весь список добавляется в начало @INC целиком. Например:

PERL5LIB=1:2:3 perl

приведёт к @INC, начинающемуся с:

qw(1 2 3)
комбинации -I, -M и PERL5LIB

PERL5LIB применяется в первую очередь, затем все аргументы -I, затем все аргументы -M. Например:

PERL5LIB=e1:e2 perl -I i1 -Mlib=m1 -I i2 -Mlib=m2

приведёт к @INC, начинающемуся с:

qw(m2 m1 i1 i2 e1 e2)
переменная среды PERL5OPT

Она содержит список параметров, разделённых пробелами. В данном разделе мы рассматриваем только эффекты -M и -I.

После обычной обработки параметров -I из командной строки, все параметры -I из PERL5OPT извлекаются. Они обрабатываются слева направо, а не справа налево. Также обратите внимание, что, в то время как пробелы допускаются между параметром -I и его директорией в командной строке, они не допускаются в PERL5OPT.

После обычной обработки параметров -M из командной строки, все параметры -M из PERL5OPT извлекаются. Они обрабатываются слева направо, то есть так же, как и параметры в командной строке.

Пример может прояснить это:

export PERL5OPT="-Mlib=optm1 -Iopti1 -Mlib=optm2 -Iopti2"
export PERL5LIB=e1:e2
perl -I i1 -Mlib=m1 -I i2 -Mlib=m2

приведёт к @INC, начинающемуся с:

qw(
    optm2
    optm1

    m2
    m1

    opti2
    opti1

    i1
    i2

    e1
    e2
)
Другие осложнения

В приведённых выше примерах есть некоторые осложнения, которые игнорируются:

arch и version поддиректории

Все -I, PERL5LIB и use lib также добавят поддиректории arch и version, если они присутствуют

sitecustomize.pl

© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.34.0/perlrun

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API