Spec-Zone.ru › Perl 5.36

perlrun

СОДЕРЖАНИЕ

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

ИМЯ

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

СИНТАКСИС

perl [ -gsTtuUWX ] [ -h?v ] [ -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 символа (если применимо), либо замените использование -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 v5.14;

Переключатели командной строки

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

#!/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. Флаг "-g" является более простым псевдонимом для него.

Вы также можете указать разделительный символ в шестнадцатеричном формате: -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 больше не является значением по умолчанию в UTF-8 локалях" в perl581delta.)

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

Только для чтения магическая переменная ${^UNICODE} отражает числовое значение этого параметра. Эта переменная устанавливается при запуске Perl и далее является только для чтения. Если вам нужны эффекты во время выполнения, используйте open() с тремя аргументами (см. "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)
     8192  h  Show hash randomization debug output (changes to
              PL_hash_rand_bits and their origin)
    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 предоставляет для сценариев оболочки, вы не можете использовать переключатель -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".

-g

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

Этот флаг — более простой псевдоним для -0777.

Мемоники: gobble, grab, gulp.

-h

выводит краткое описание опций.

-?

синоним для -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, как можно ожидать.

-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, поэтому не импортирует подпрограммы и не оказывает эффекта прагмы.

-Mmodule выполняет use module ; перед выполнением вашей программы. Это загружает модуль и вызывает его метод import, вызывая его стандартное действие, обычно импорт подпрограмм или прагматическое действие. Вы можете использовать кавычки для добавления дополнительного кода после имени модуля, например '-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 не рекомендуется. См. Getopt::Long для более гибкого разбора переключателей.

-S

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

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

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

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

#!/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".

Это не имеет эффекта, если ваш perl был скомпилирован без поддержки проверки на заражение.

-T

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

-u

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

-U

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

-v

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

-V

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

-V:configvar

Выводит в STDOUT значение(я) заданной конфигурационной переменной(ых), несколько значений, когда ваш аргумент 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 пragma. Вы можете отключить или преобразовать в фатальные ошибки определённые предупреждения, используя __WARN__ обработчики, как описано в perlvar и "warn" в perlfunc. См. также perldiag и perltrap. Также доступна детальная система предупреждений, если вы хотите манипулировать целыми классами предупреждений; см. warnings.

-W

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

-X

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

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

-x
-xdirectory

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

Все ссылки на номера строк программой (предупреждения, ошибки и т. д.) будут обрабатывать #! строку как первую строку. Таким образом, предупреждение на 2-й строке программы, которая находится на 100-й строке в файле, будет сообщено как на 2-й строке, а не на 100-й. Это можно переопределить, используя директиву #line. (См. "Plain Old Comments (Not!)" в 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, проверка на утечку включена, запись "dot" в @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, и т.д.

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

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

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

В этом релизе (5.30) используется :unix как нижний слой в Win32, и поэтому всё ещё используются числовые системные функции файла компилятора C.

Переменная среды 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 должен использовать для выполнения команд «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".

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

PERL_DESTRUCT_LEVEL

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

PERL_DL_NONLAZY

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

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=NO, а любое другое значение подразумевает PERL_PERTURB_KEYS=2/PERL_PERTURB_KEYS=DETERMINISTIC. Смотрите документацию для PERL_PERTURB_KEYS для важных замечаний относительно режима DETERMINISTIC.

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

Смотрите "Атаки на алгоритмическую сложность" в 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, если явно не задан PERL_HASH_SEED.

При установке в "2" или "DETERMINISTIC", вставка ключей в хеш приведет к изменению порядка ключей, но таким образом, который повторяется от запуска к запуску программы, при условии, что используется тот же семенной хеш и что код не выполняет никаких не детерминированных операций и также при точно таком же контексте среды. Добавление или удаление переменной окружения может и, скорее всего, изменит порядок ключей. Если любая часть кода создает хеш с использованием не детерминированных ключей, например, хеш с ключами в виде строковой формы ссылки или адреса содержащих его объектов, это может и, скорее всего, окажет глобальное влияние на порядок ключей *всех* хешей в процессе. Для корректной работы этот параметр ОБЯЗАТЕЛЬНО должен быть связан с PERL_HASH_SEED для получения детерминированных результатов, и, фактически, если вы явно устанавливаете PERL_HASH_SEED, вам не нужно устанавливать его также, он будет автоматически установлен в этот режим.

ПРИМЕЧАНИЕ: Использование этого параметра считается небезопасным и предназначено только для отладки не детерминированного поведения функции хеширования 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 записывает всю информацию в stdout. Вы можете записывать в другие открытые дескрипторы файлов различными способами:

$ 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

сначала использует pragma 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.36.0/perlrun

Spec-Zone.ru

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