Spec-Zone.ru › Perl 5.28

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. Переданная неявно через стандартный ввод. Это работает только если нет аргументов имени файла – для передачи аргументов программе, которая считывает со стандартного ввода, вы должны явно указать «-» в качестве имени программы.

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

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

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

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

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

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

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

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

#!/usr/bin/env perl

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

Если #! строка не содержит слово «perl» или «indir», программа, названная после #!, выполняется вместо интерпретатора Perl. Это немного странно, но это помогает людям на машинах, которые не выполняют #!, потому что они могут сказать программе, что их SHELL – /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 и его вспомогательные утилиты в каталоге, обычно присутствующем в пути пользователя, или в другом очевидном и удобном месте.

В этой документации #!/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 являются допустимыми шестнадцатеричными цифрами. В отличие от восьмеричной формы, эта форма может быть использована для указания любого символа Unicode, даже тех, которые находятся за пределами 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 Unicode.

Начиная с версии 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() и binmode() можно управлять потоками как обычно.

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

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

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

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

Примечание: Начиная с 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
  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.

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

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

# 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, см. в "Why does Perl let me delete read-only files? Why does -i clobber protected files? Isn't this a bug in Perl?" в perlfaq5.

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

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

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

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

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

-Idirectory

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

-l[octnum]

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

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

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

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

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

-m[-]module
-M[-]module
-M[-]'module ...'
-[mM][-]module=arg[,arg]...

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

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

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

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

Следствие формулировки split состоит в том, что -MMODULE=number никогда не выполняет проверку версии, если MODULE::import() сам не настроен на выполнение проверки версии, что может произойти, например, если MODULE унаследован от 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 $running_under_some_shell;

Система игнорирует первую строку и передает программу в /bin/sh, которая пытается выполнить программу Perl как скрипт оболочки. Оболочка выполняет вторую строку как обычную команду оболочки и тем самым запускает интерпретатор Perl. На некоторых системах $0 не всегда содержит полный путь, поэтому -S сообщает Perl о необходимости поиска программы при необходимости. После того, как Perl найдёт программу, он проанализирует строки и проигнорирует их, потому что переменная $running_under_some_shell никогда не принимает значение true. Если программа будет интерпретироваться 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 $running_under_some_shell;

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

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

-t

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

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

-T

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

-u

Этот переключатель заставляет Perl выводить core после компиляции вашей программы. Затем вы теоретически можете использовать этот дамп ядра и преобразовать его в исполняемый файл с помощью программы undump (не поставляется). Это ускоряет запуск в ущерб некоторому дисковому пространству (которое можно минимизировать, удалив исполняемый файл). (Тем не менее, исполняемый файл "hello world" занимает около 200 КБ на моей машине). Если вы хотите выполнить часть вашей программы перед дампом, используйте оператор 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';
    ....

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

$ 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.

-x
-xdirectory

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

Все ссылки на номера строк в программе (предупреждения, ошибки и т. д.) будут обрабатывать строку #! как первую строку. Таким образом, предупреждение на 2-й строке программы, которая находится на 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. Допускаются только переключатели -[CDIMUdmtwW]. При выполнении проверок на загрязнение (либо потому, что программа выполнялась с правами setuid или setgid, либо использовался переключатель -T или -t), эта переменная игнорируется. Если PERL5OPT начинается с -T, загрязнение будет включено, а последующие параметры игнорируются. Если PERL5OPT начинается с -t, загрязнение будет включено, запись dot в @INC удалится, и последующие параметры будут учтены.

PERLIO

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

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

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

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

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

:bytes

Псевдослой, который отключает флаг :utf8 для слоя ниже; вряд ли будет полезен сам по себе в глобальной переменной среды PERLIO. Возможно, вы имели в виду :crlf:bytes или :perlio:bytes.

:crlf

Слой, который выполняет перевод CRLF в "\n" перевод, различающий файлы «текст» и «двоичные» файлы по аналогии с MS-DOS и схожими операционными системами. (В настоящее время он не имитирует MS-DOS в отношении обработки Control-Z как маркера конца файла.)

:mmap

Слой, который реализует «чтение» файлов с использованием mmap(2) для отображения всего файла в адресном пространстве процесса, а затем использования этого как «буфера» PerlIO.

:perlio

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

:pop

Экспериментальный псевдослой, который удаляет верхний слой. Используйте с той же осторожностью, что и с нитроглицерином.

:raw

Псевдослой, который манипулирует другими слоями. Применение слоя :raw эквивалентно вызову binmode($fh). Он заставляет поток пропускать каждый байт как есть без перевода. В частности, перевод CRLF и выведение :utf8 из локали отключаются.

В отличие от предыдущих версий Perl, :raw не является просто обратной стороной :crlf: также удаляются или отключаются другие слои, которые могли бы повлиять на двоичный характер потока.

:stdio

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

:unix

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

:utf8

Псевдослой, который включает флаг в нижнем слое, чтобы сообщить Perl, что вывод должен быть в кодировке utf8, а вход должен рассматриваться как уже имеющий действительную форму utf8. ПРЕДУПРЕЖДЕНИЕ: он не проверяет валидность и, следовательно, должен быть использован с большой осторожностью для ввода, так как могут произойти нарушения безопасности с некратчайшими кодировками UTF-8 и т. д. В целом :encoding(UTF-8) является лучшим вариантом при чтении данных, закодированных в UTF-8.

:win32

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

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

В Unix-подобных системах он эквивалентен «unix perlio» или «stdio». Конфигурация настроена так, чтобы отдавать предпочтение реализации «stdio», если системная библиотека обеспечивает быстрый доступ к буферу; в противном случае она использует реализацию «unix perlio».

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

В этом выпуске (5.14) в Win32 используется unix в качестве нижнего слоя, а следовательно, по-прежнему использует числовые дескрипторы файлов компилятора C. Есть экспериментальный нативный слой win32 , который, как ожидается, будет доработан и, в конечном итоге, станет стандартным в Win32.

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

PERLIO_DEBUG

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

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

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

> 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 должен использовать для выполнения команд в «обратных кавычках» или 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 (провайдеров слоёв обслуживания), несовместимых с IFS. Perl обычно ищет LSP, совместимый с IFS, поскольку это необходимо для эмуляции сокетов Windows в качестве реальных дескрипторов файлов. Однако это может вызвать проблемы, если у вас есть брандмауэр, такой как McAfee Guardian, который требует, чтобы все приложения использовали его LSP, но который не совместим с IFS, поскольку Perl обычно будет избегать использования такого LSP.

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

PERL_DEBUG_MSTATS

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

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

PERL_DESTRUCT_LEVEL

Актуально только если ваш исполняемый файл Perl был скомпилирован с -DDEBUGGING; это управляет поведением глобального уничтожения объектов и других ссылок. Для получения дополнительной информации см. "PERL_DESTRUCT_LEVEL" в perlhacktips.

PERL_DL_NONLAZY

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

PERL_ENCODING

Если используется псевдоним 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. Ручное задание семени может частично или полностью устранить эту защиту.

См. "Атаки на основе сложности алгоритмов" в 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() и key_traversal_mask() в Hash::Util.

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

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)емью и/или (s)v, необязательно с (t)ими. Например, 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

Доступно в Perl 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)};

© 1993–2020 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.28.3/perlrun

Spec-Zone.ru

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