Spec-Zone.ru › Perl 5.32

perlrun

СОДЕРЖАНИЕ

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

НАЗВАНИЕ

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

СИНТАКСИС

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

ОПИСАНИЕ

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

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

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

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

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

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

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

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

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

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

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

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

#!/usr/bin/env perl

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

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

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

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

#! и цитирование в системах, отличных от Unix

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

OS/2

Вставьте

extproc perl -S -your_switches

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

MS-DOS

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

Win95/NT

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

VMS

Вставьте

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

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

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

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

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

Например:

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

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

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

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

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

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

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

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

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

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

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

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

use 5.014;

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

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

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

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

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

-0[octal/hexadecimal]

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

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

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

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

-a

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

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

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

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

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

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

-C [number/list]

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

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

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

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

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

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

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

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

(В Perl-версиях до 5.8.1 переключатель -C был переключателем, предназначенным только для Win32, который позволял использовать «широкие системные вызовы» 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 вместо импорта. Список опций, разделенных запятыми, должен следовать за символом = . Если указано t, это указывает отладчику, что в отлаживаемом коде будут использоваться потоки. См. perldebug.

-Dletters
-Dnumber

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

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

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

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

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

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

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

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

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

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

-e commandline

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

-E commandline

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

-f

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

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

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

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

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

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

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

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

-Fpattern

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

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

-h

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

-i[extension]

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

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

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

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

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

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

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

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

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

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

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

Из командной строки, сказав

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

то же самое, что использовать программу:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

-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

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

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

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

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

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

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

eval '(exit $?0)' && eval 'exec perl -wS $0 ${1+"$@"}'
& eval 'exec /usr/bin/perl -wS $0 $argv:q'
        if $running_under_some_shell;

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

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

-t

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

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

-T

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

-u

Этот переключатель заставляет Perl сгенерировать дамп ядра после компиляции вашей программы. Затем вы теоретически можете преобразовать этот дамп ядра в исполняемый файл с помощью программы 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. Вы можете отключить или преобразовать в фатальные ошибки определённые предупреждения, используя __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, проверка на вредоносный код будет включена, запись с правами записи в точку удалится из @INC, и последующие параметры будут учтены.

PERLIO

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

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

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

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

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

:crlf

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

:perlio

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

:stdio

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

:unix

Базовый слой, вызывающий read, write, lseek, и т.д.

:win32

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

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

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

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

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

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

PERLIO_DEBUG

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

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

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

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

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

PERLLIB

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

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

PERL5DB

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

BEGIN { require "perl5db.pl" }

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

PERL5DB_THREADED

Если установлено значение «истина», отладчик получит информацию о том, что отлаживаемый код использует потоки.

PERL5SHELL (только для Win32)

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

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

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

PERL_ALLOW_NON_IFS_LSP (только для Win32)

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

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

PERL_DEBUG_MSTATS

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

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

PERL_DESTRUCT_LEVEL

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

PERL_DL_NONLAZY

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

PERL_ENCODING

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

PERL_HASH_SEED

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

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

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

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

PERL_PERTURB_KEYS

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

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

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

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

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

PERL_HASH_SEED_DEBUG

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

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

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

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

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

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

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

PERL_SIGNALS

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

PERL_UNICODE

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

PERL_USE_UNSAFE_INC

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

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

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

PERL_INTERNAL_RAND_SEED

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

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

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

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

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

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

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

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

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

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

-I

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

perl -I 1 -I 2 -I 3

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

qw(1 2 3)
-M

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

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

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

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

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

PERL5LIB=1:2:3 perl

в результате @INC начнется с:

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

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

Например:

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

в результате @INC начнется с:

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

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

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

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

Пример:

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

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

qw(
    optm2
    optm1

    m2
    m1

    opti2
    opti1

    i1
    i2

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

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

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

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

sitecustomize.pl

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

Spec-Zone.ru

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