The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME/НАИМЕНОВАНИЕ

perlrun - Запуск интерпретатора Perl

СИНТАКСИС

perl [ -sTtuUWX ] [ -hv ] [ -V[:configvar] ] [ -cw ] [ -d[t][:отладчик] ] [ -D[кол-во/список] ] [ -pna ] [ -Fшаблон ] [ -l[восьмеричный] ] [ -0[восьмеричный/шестнадцатеричный] ] [ -Idir ] [ -m[-]модуль ] [ -M[-]'модуль...' ] [ -f ] [ -C [кол-во/список] ] [ -S ] [ -x[dir] ] [ -i[расширение] ] [ [-e|-E] 'команда' ] [ -- ] [ файл программы ] [ аргумент ]...

ОПИСАНИЕ

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

  1. Выполняется строка (однострочник), если в командной строке указаны параметры -e или -E.

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

  3. Принятый неявно через стандартный ввод. Это работает только тогда, когда в качестве аргумента нет имени файла - для передачи аргументов на STDIN (стандартный ввод/input) чтения программы необходимо явно указать "-" для имени программы.

В случаях 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 в независимости от версии программы, которая встречается первой в пользовательских путях. Если вы хотите конкретной версии Perl, скажем, perl5.14.1, вы должны поместить это прямо в путь на строке #!.

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

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

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

#! и ссылка на не-Unix системах

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

OS/2

Устанавливает

    extproc perl -S -your_switches

в качестве первой линии в *.cmd файле (-S в связи с ошибкой в ​​cmd.exe по регуляции `extproc').

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 (Digital Command Language цифровой командный язык) процедуры, говоря, @program (или косвенно через DCL$PATH только с помощью название программы).

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

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

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

Например:

    # 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 на первой строке программы будет стоять какой бы метод не работал в вашей системе. Вам рекомендуется использовать определенный путь, если вы заботитесь о конкретной версии интерпретатора Perl.

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

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

    use 5.014;

Опции команды

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

    #!/usr/bin/perl -spi.orig   # то же самое -s -p -i.orig

Переключатели (опции Switches) включают в себя:

-0[восьмеричный/шестнадцатеричный]

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

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

Специальное значение 00 приводят Perl захватывать файлы по параграфам (slurp files in paragraph mode). Любое значение 0400 или выше, будет вызывать Perl захватывать файлы целиком, но по соглашению значение 0777 является тем, которое обычно используется для этой цели.

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

-a

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

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

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

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

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

-C [number/list]

Флаг -C указывает на некоторые из функций Perl Unicode.

По состоянию на 5.8.1, -C может следовать либо номер или список параметров, букв. Буквы, их числовые значения и эффекты являются следующие перечисление букв равно суммированию чисел.

    I     1   STDIN считается в UTF-8
    O     2   STDOUT будет в UTF-8
    E     4   STDERR будет в UTF-8
    S     7   I + O + E
    i     8   UTF-8 представляет собой слой умолчанию PerlIO для потоков ввода
    o    16   UTF-8 представляет собой слой PerlIO умолчанию для потоков вывода
    D    24   i + o
    A    32    элементы @ARGV ожидаются, как закодированные строки
              в UTF-8
    L    64   обычно "IOEioA" являются безусловными, L являются безусловными (normally the "IOEioA" are unconditional, the L makes)
              они зависят от локальных переменных среды
              (LC_ALL, LC_TYPE, и LANG, в следующем порядке
              убывания приоритета) - если переменные указывают
              UTF-8, потом выбирается "IOEioA" в действительности (UTF-8, then the selected "IOEioA" are in effect)
    a   256   Установите ${^UTF8CACHE} в -1, для запуска UTF-8 кэширования
              код в режиме отладки.

=для документирования_поддокументов (documenting_the_underdocumented) perl.h gives W/128 as PERL_UNICODE_WIDESYSCALLS "/* for Sarathy */"

=для будущего (todo) perltodo упоминает Unicode в %ENV и именах файлов. Я думаю, что это будут варианты e и f (или F).

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

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

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

Вы можете использовать -C0 (или "0" для PERL_UNICODE, чтобы явно отключить все выше Unicode особенности (features).

Волшебная переменная только для чтения ${^UNICODE} отражает числовое значение данного параметра. Эта переменная устанавливается во время запуска Perl и после этого она доступна только для чтения. Если вы хотите эффекта во время выполнения (runtime effects), используйте трёхаргументный open() (see "open" in perlfunc), двухаргументный binmode () (см. "binmode" in perlfunc ) И прагму (pragma) open (см. open).

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

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

-c

вызывает Perl для проверки синтаксиса программы и последующего выхода без выполнения. На самом деле, эта опция будет выполнять и BEGIN, UNITCHECK или С<CHECK> блоки и любые use объявления: они рассматриваются как происходящие за пределами выполнения вашей программы. INIT и END блоки, однаку, будут пропущены.

-d
-dt

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

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

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

-Dletters
-Dnumber

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

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

        1  p  Разбор на токены или слова и парсинг (Tokenizing and parsing) (с v, отображает стек разборk)
        2  s  Снимок (snapshots) стека (с v, отображает все стеки)
        4  l  Контекст (цикла) стек обработки
        8  t  Трассирует выполнение
       16  o  Метод и разрешения перегрузки
       32  c  Строковые/числовые преобразования
       64  P  Печатает профилирующую информацию, исходный файл входного состояния 
      128  m  Память и распределение SV (Scalar Value) скалярных переменных
      256  f  Формат обработки
      512  r  Разбор регулярных выражений и их исполнение
     1024  x  Дамп синтаксического дерева (Syntax tree dump)
     2048  u  Проверки на разрушение 
     4096  U  Неофициальный, Пользовательский хак (hacking)(зарезервирован для частного,
              неизданного использования)
     8192  H  Хэш дамп (Hash dump) -- узурпирует/захватывает (usurps) values()
    16384  X  Блокнот распределения (Scratchpad allocation)
    32768  D  Очистка (Cleaning up)
    65536  S  Распределение оперативной памяти (Op slab allocation http://ru.wikipedia.org/wiki/Slab)
   131072  T  Разделение на слова/токены (Tokenizing)
   262144  R  Включая счетчики ссылок дампинговых переменных (например, при
              использование -Ds)
   524288  J  показывает s,t,P-отладка (не выпрыгивать выше) на коды операций в оперативной памяти (show s,t,P-debug (don't Jump over) on opcodes withi)
              package DB
  1048576  v  Verbose (многословный): использовать в сочетании с другими флагами
  2097152  C  Копирование при записи (Copy On Write)
  4194304  A  Проверка согласованности внутренних структур
  8388608  q  quiet - в настоящее время только подавляет "Запуск" ("EXECUTING")
              message
 16777216  M  отслеживает умное сопоставление (trace smart match resolution)
 33554432  B  дамп подпрограммы определения, в том числе специальные блоки (dump suBroutine definitions, including special Block)
              like НАЧАЛО

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

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

  # Если у вас есть утилита "env"
  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
  % (setenv PERLDB_OPTS "NonStop=1 AutoTrace=1 frame=2"; perl -dS program)

См. perldebug для деталей и вариаций.

-e commandline

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

-E commandline

ведет себя так же, как -e, за исключением того, что она неявно включает все дополнительные функции (в основном блоке компиляции, например say). См. 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, в своей собственной лексической области. Однако, если сценарий умирает (dies), $@ не будет установлен.

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

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

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

-Fpattern

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

-h

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

-i[extension]

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

Если расширение не указано, и ваша система поддерживает его, оригинальный файл остается открытым без имени в то время как вывод будет перенаправлен в новый файл с оригинальным именем . Когда Perl выходит, чисто или нет, исходный файл удаляется (unlinked).

Если расширение не содержит *, то оно добавляется к концу текущего файла в качестве суффикса. Если расширение содержит один или более символов *, то каждый * заменяется с текущим именем файла. В 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'

Эти наборы однострочников (one-liners) эквивалентны:

 $ perl -pi -e 's/bar/baz/' fileA          # перезаписать текущий файл
 $ perl -pi'*' -e 's/bar/baz/' fileA       # перезаписать текущий файл

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

Из shell, говоря

    $ 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;  # здесь напечатается исходное имя файла
    }
    select(STDOUT);

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

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

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

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

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

Для обсуждения вопросов, связанных с правами доступа к файлам и -i, см. "Why does Perl let me delete read-only files? (Почему Perl даёт мне удалить файлы только для чтения?) Почему -i разбивает (clobber) защищенные файлы? Разве это не ошибка в Perl?" in perlfaq5.

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

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

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

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

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

-Idirectory

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

-l[octnum]

обеспечивает автоматическое завершения строк обработки. Она состоит из двух отдельных эффектов. Во-первых, он автоматически обрезает (chomps) $/ (разделитель входных записей) при использовании -n или -p. Во-вторых, он присваивает $\ (разделителю выходных записей), чтобы иметь значение octnum (восьмиричное число) так что любые операторы печати будут иметь разделитель выданный обратно (will have that separator added back on). Если octnum> опущен, устанавливает $\; для текущего значения как $/. Например, для обрезки линий до 80 символов/столбцов (columns):

    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 (); перед выполнением программы.

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

Если первый символ после -M или -m является тире (-), то «использование» заменяется на «нет».

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

Следствием этого является то, что -MMODULE=number никогда не делает проверку версии, если MODULE::import()> сам настроен сделать проверку версий, что может произойти, например, если MODULE наследует от Exporter .

-n

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

  LINE:
    while (<>) {
        ...             # ваша программа идет здесь
    }

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

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

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

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

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

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

-p

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

  LINE:
    while (<>) {
        ...             # ваша программа идет здесь
    } continue {
        print or die "-p destination: $!\n";
    }

Если файл, указанный в аргументе не может быть открыт по некоторым причинам, Perl предупреждает вас об этом, и переходит к следующему файлу. Следует отметить, что строки печатаются автоматически. Ошибка, произошедшая во время печати рассматриваются как фатальная. Чтобы подавить печать используйте флаг -n. A -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". Кроме того, при использовании этой опции на сценарии с включенными предупреждениями вы можете получить много ложных "используется только один раз" ("used only once") предупреждений.

-S

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

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

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

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

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

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

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

-u

Этот выключатель принуждает Perl сваливать ядро ​​в дамп после компиляции программы (This switch causes Perl to dump core after compiling your program.). Затем можно теоретически воспользоваться этим дампом и превратить его в исполняемый файл с помощью программы undump (не прилагается). Это ускоряет запуск за счет некоторого дискового пространства (которое можно свести к минимуму путем удаления исполняемого файла). (Тем не менее, "привет мир" исполняемый файл выходит около 200K на моей машине.) Если вы хотите, чтобы выполнить часть вашей программы перед дампом, используйте вместо этого оператор dump(). Примечание: наличие undump зависит от платформы и может быть не доступно для конкретного порта Perl.

-U

позволяет Perl делать небезопасные операции. В настоящее время единственной «небезопасной» операцией является пытка разорвать связь между каталогами, тогда, когда нет привилегий суперпользователя и работает SETUID программа со смертельными проверками меток (taint), которые превращаются в предупреждения. Обратите внимание, что предупреждения (warnings) должны быть включены вместе с этим параметром, чтобы на самом деле I <генерировать> предупреждения метко-проверки (taint-check warnings).

-v

выдает номер версии и патч (patchlevel) вашего исполняемого 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';
        ....

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

    $ echo "сжатые-переменные: " `perl -V:z.*: ` " уже здесь !"
    сжатые-переменные:  zcat='' zip='zip' уже здесь !

Ведущее двоеточие удаляет "name =" часть ответа, это позволяет отображать в имени. (A leading colon removes the "name=" part of the response, this allows you to map to the name you need.) (мнемоника: пустые метки)

    $ 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 Pragma является предпочтительной. Вы можете отключить или продвижения в фатальные ошибки конкретные предупреждения использованием хука __WARN__ , как описано в perlvar и "warn" in perlfunc . См. также perldiag и perltrap. Мелкозернистой средство предупреждения также доступна, если вы хотите управлять целыми классами предупреждения, см. warnings или perllexwarn .

-W

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

-X

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

-x
-xdirectory

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

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

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

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

ОКРУЖЕНИЕ (ENVIRONMENT)

HOME

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

LOGDIR

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

PATH

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

PERL5LIB

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

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

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

    use lib "/my/directory";
PERL5OPT

Параметры командной строки (switches) переключатели. Опции в этой переменной, рассматриваются как если бы они были на каждом Perl командной строки. Только B &lt;- [CDIMUdmtwW]&gt; переключатели допускается. При запуске проверки меток (taint check) (либо потому, что программа работает SETUID или SETGID, или потому что были использованы ключи -T или -t), эта переменная игнорируется. Если PERL5OPT начинается с -T, заражение(tainting) будет включена и последующие варианты игнорируются. Если PERL5OPT начинается с -t, заражение(tainting) будет включено, точка удаляется из @INC, и последующие опции учитываются (subsequent options honored).

PERLIO

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

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

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

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

Слои имеет смысл включить в переменную среды PERLIO кратко изложены ниже. Для получения дополнительной информации см. PerlIO.

:bytes

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

:crlf

Слой, который делает СRLF для "\n" перевод различия "текст" и "двоичный" файлы в виде MS-DOS и аналогичные операционных систем. (В настоящее время она не имитировать MS-DOS, насколько лечении Control-Z как конец файла маркер.)

:mmap

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

:perlio

Это вновь осуществления STDIO-подобный буферизации виде слоя PerlIO. Как таковой, он будет вызывать все, что слой под ним для осуществления своей деятельности, обычно :unix.

:pop

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

:raw

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

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

:stdio

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

:unix

Низкий уровень слоя, который вызывает read , write , lseek и т.д.

:utf8

Псевдослой (Pseudolayer), который включает флаг в слое ниже, чтобы сказать, что Perl вывод должен быть в utf8 и что материалы следует считать уже в utf8 действительны форме. B <WARNING: Он не проверяет на достоверность и как таковой должны быть обработаны с особой осторожностью для ввода, так как нарушения безопасности могут происходиять с не-кратчайший UTF-8 кодировках, и т.д..> Вообще :encoding(utf8) является наилучшим вариантом при чтении UTF-8 закодированных данных.

:win32

На платформе Win32 это экспериментальный уровень использует родной "ручки" IO, а не Unix-подобных числовых слоя дескриптор файла. Известный как детский баг(buggy) в этой версии (5.14).

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

Для Unix платформ, которые будут эквивалент "UNIX PerlIO" или "STDIO". Настройка настроена предпочтительность "STDIO" реализацию, если библиотеки системы обеспечивает быстрый доступ к буферу, в противном случае, он использует "UNIX PerlIO" реализации.

В Win32 по умолчанию в этой версии (5.14) является "unix crlf". Win32 в "stdio" имеет ряд ошибок/MIS-функций (bugs/mis-features) для Perl IO которых несколько в зависимости от версии и поставщик компилятора C. Используя нашу собственную crlf слоя в качестве буфера позволяет избежать этих проблем и делает вещи более равномерным. crlf CRLF слой обеспечивает преобразование а также буферизации.

Этот релиз (5.14) использует unix в качестве нижнего слоя на Win32, и так до сих пор использует компилятора C. числовые процедуры дескриптор файла. Существует экспериментальная родной win32 слой, который как ожидается, будет повышена и должна в конечном итоге стать по умолчанию под Win32.

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

PERLIO_DEBUG

Если установлено имя файла или устройства, определенные операции PerlIO подсистемы будут записываться в этот файл, который открывается в режиме добавления. Типичное применение: Unix:

   % env PERLIO_DEBUG=/dev/tty perl script ...

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

   > set PERLIO_DEBUG=CON
   Perl скрипт ...

Эта функция отключена для SETUID скрипты и скрипты для запуска с -T.

PERLLIB

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

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

PERL5DB

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

        BEGIN { require "perl5db.pl" }

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

PERL5DB_THREADED

Если установлена ​​в истинное значение, указывает, что отладчик кода отлаживаемой использует потоки.

PERL5SHELL (specific to the Win32 port)

В Win32 только порты, может быть установлен в альтернативную оболочку, которая должна использовать Perl внутренне для выполнения "обратные" ("backtick") команды или system(). По умолчанию cmd.exe /x/d/c на WindowsNT и command.com /c на Windows 95. Значение считается пробел. Предшествовать любой символ, который нуждается в защите, как и пространство или обратную косую черту, с другой косой чертой.

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

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

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

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

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

PERL_DEBUG_MSTATS

Релевантно только в Perl скомпилирован с malloc входит в Perl распределения, то есть, если perl -V:d_mymalloc будет "определен".

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

PERL_DESTRUCT_LEVEL

Соответствующие только если ваш Perl исполняемый был построен с -DDEBUGGING, это управляет поведением глобального уничтожения объектов и др. Ссылки. See "PERL_DESTRUCT_LEVEL" in perlhacktips для получения дополнительной информации.

PERL_DL_NONLAZY

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

PERL_ENCODING

При использовании use encoding Pragma без явного именем кодировки, PERL_ENCODING переменная окружения консультировал имя кодировки.

PERL_HASH_SEED

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

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

B <ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: хэш ключи чувствительно к информации> . Хэши рандомизированных для защиты от удаленных и локальных атак против кода Perl. Путем ручной настройки семян, эта защита может быть частично или полностью потеряны.

См. "Algorithmic Complexity Attacks" in perlsec and "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" ; со вставкой ключей в хэш причинит ключевой для изменения, но таким образом, что повторяется от программы запуска на выполнение программы.

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

См. "Algorithmic Complexity Attacks" in 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" предназначена для помощи в отладке недетерминированное поведение вызвано хэш рандомизации.

B <Примечание> , что любая информация о хэш-функции, особенно хэш семя sensitive information :, Зная это, можно выработать отказ в обслуживании против кода Perl, даже отдаленно, см. "\"Algorithmic Complexity Attacks\"" in perlsec для получения дополнительной информации. B <Не разглашайте хэш семян> для людей, которые не нужно это знать. См. также 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)emory (памяти) and/or (s)v (скалятрной переменной), optionally with (t)imestamps (опционально в датой и временем). Например, PERL_MEM_LOG=1mst регистрирует все информацию на стандартный вывод. Вы можете написать другим открываемым дескрипторов файлов в различных формах:

  $ 3>foo3 PERL_MEM_LOG=3m perl ...
PERL_ROOT (specific to the VMS port)

Перевод скрытой коренится логическое имя, которое содержит 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 , То безопасным (но отложенные) сигналы. См. ""Deferred Signals (Safe Signals)" (Отложенные сигналы (Безопасные сигналы))" in perlipc.

PERL_UNICODE

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

SYS$LOGIN (характерные для VMS порт)

Используется, если ChDir не имеет аргументов, домашнего и LOGDIR не установлены.

Perl также имеет переменные окружения, которые контролируют как Perl обрабатывает данные, специфичные для конкретного естественного языка, см. L <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)};

ПЕРЕВОДЧИКИ

  • Николай Мишин <mishin@cpan.org>