perlrun
СОДЕРЖАНИЕ
ИМЯ
perlrun - как выполнить интерпретатор Perl
СИНТАКСИС
perl [ -gsTtuUWX ] [ -h?v ] [ -V[:configvar] ] [ -cw ] [ -d[t][:debugger] ] [ -D[number/list] ] [ -pna ] [ -Fpattern ] [ -l[octal] ] [ -0[octal/hexadecimal] ] [ -Idir ] [ -m[-]module ] [ -M[-]'module...' ] [ -f ] [ -C [number/list] ] [ -S ] [ -x[dir] ] [ -i[extension] ] [ [-e|-E] 'command' ] [ -- ] [ programfile ] [ argument ]...
ОПИСАНИЕ
Обычный способ запуска программы Perl — сделать её непосредственно исполняемой или передать имя исходного файла в качестве аргумента в командной строке. (Также возможна интерактивная среда Perl — см. perldebug для получения подробной информации об этом.) При запуске Perl ищет вашу программу в одном из следующих мест:
-
Указанная строка за строкой через переключатели -e или -E в командной строке.
-
Содержащаяся в файле, указанном первым именем файла в командной строке. (Обратите внимание, что системы, поддерживающие обозначение
#!, вызывают интерпретаторы таким образом. См. «Расположение Perl».) -
Передаваемая неявно через стандартный ввод. Это работает только в том случае, если нет аргументов имени файла — для передачи аргументов в программу, считывающую со стандартного ввода, вы должны явно указать «-» в качестве имени программы.
В методах 2 и 3 Perl начинает разбор файла ввода с начала, если вы не указали переключатель "-x", в этом случае он ищет первую строку, начинающуюся с #! и содержащую слово "perl", и начинает с неё. Это полезно для запуска программы, встроенной в более длинное сообщение. (В этом случае вы бы указали конец программы, используя маркер __END__)
Строка #! всегда проверяется на наличие переключателей во время её разбора. Таким образом, если вы находитесь на компьютере, где допускается только один аргумент со строкой #!, или что ещё хуже, не распознаёт даже строку #!, вы всё равно можете получить согласованное поведение переключателей независимо от того, как был вызван Perl, даже если использовался переключатель "-x" для поиска начала программы.
Так как некоторые операционные системы исторически молча обрезали интерпретацию ядром строки #! после 32 символов, некоторые переключатели могут передаваться в командной строке, а некоторые — нет; вы даже можете получить «-» без соответствующей буквы, если не будете внимательны. Вы, вероятно, захотите убедиться, что все ваши переключатели находятся либо перед, либо после этой границы в 32 символа. Большинство переключателей на самом деле не обращают внимания на их избыточную обработку, но получение «-» вместо полного переключателя может привести к попытке Perl выполнить стандартный ввод вместо вашей программы. А частичный переключатель -I также может привести к нестандартным результатам.
Некоторые переключатели обращают внимание на их обработку дважды, например, комбинации -l и -0. Либо поместите все переключатели после границы в 32 символа (если применимо), либо замените использование -0цифр на BEGIN{ $/ = "\0digits"; }.
Разбор переключателей #! начинается там, где упоминается "perl" в строке. Последовательности "-*" и "- " специально игнорируются, чтобы вы могли, если захотите, сказать
#!/bin/sh
#! -*- perl -*- -p
eval 'exec perl -x -wS $0 ${1+"$@"}'
if 0; чтобы позволить Perl увидеть переключатель "-p".
Аналогичный трюк использует программа env, если она у вас есть.
#!/usr/bin/env perl В приведённых выше примерах используется относительный путь к интерпретатору perl, получая ту версию, которая первой находится в пути пользователя. Если вам нужна определённая версия Perl, например perl5.14.1, вы должны разместить её непосредственно в пути строки #!.
Если строка #! не содержит ни слова «perl», ни слова «indir», то программа, названная после #!, выполняется вместо интерпретатора Perl. Это немного странно, но это помогает людям на машинах, где не реализовано #!, так как они могут указать программе, что их оболочка — /usr/bin/perl, и Perl затем перенаправит программу к правильному интерпретатору для них.
После нахождения вашей программы Perl компилирует всю программу во внутреннюю форму. Если возникают ошибки компиляции, выполнение программы не пытается. (В отличие от типичного скрипта оболочки, который может работать частично до тех пор, пока не обнаружит синтаксическую ошибку.)
Если программа синтаксически корректна, она выполняется. Если программа доходит до конца, не встретив операторы exit() или die(), то подразумевается exit(0), чтобы указать успешное завершение.
#! и цитирование в системах, отличных от Unix
Техника Unix #! может быть смоделирована в других системах:
- OS/2
-
Поместите
extproc perl -S -your_switchesв качестве первой строки в файле
*.cmd("-S" из-за ошибки в обработке `extproc` в cmd.exe). - MS-DOS
-
Создайте пакетный файл для запуска вашей программы и закодируйте его в
ALTERNATE_SHEBANG(см. файл dosish.h в дистрибутиве исходного кода для получения дополнительной информации). - Win95/NT
-
Установка Win95/NT при использовании установщика ActiveState для Perl изменяет реестр, чтобы ассоциировать расширение .pl с интерпретатором perl. Если Perl установлен другими средствами (включая сборку из исходных кодов), возможно, вам придётся изменить реестр самостоятельно. Обратите внимание, что это означает, что теперь вы не можете отличить исполняемую программу Perl от файла библиотеки Perl.
- VMS
-
Поместите
$ perl -mysw 'f$env("procedure")' 'p1' 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8' ! $ exit++ + ++$status != 0 and $exit = $status = undef;вверху вашей программы, где -mysw — любые переключатели командной строки, которые вы хотите передать в Perl. Теперь вы можете вызвать программу напрямую, сказав
perl program, или как процедуру DCL, сказав@program(или неявно через DCL$PATH, просто используя имя программы).Эта фраза немного сложна для запоминания, но Perl отобразит её для вас, если вы скажете
perl "-V:startperl".
Интерпретаторы команд в системах, отличных от Unix, имеют совершенно другие представления о цитировании, чем оболочки Unix. Вам нужно будет изучить специальные символы в вашем интерпретаторе команд (*, \ и " являются распространёнными) и то, как защитить пробелы и эти символы, чтобы запустить однострочные команды (см. -e ниже).
В некоторых системах вам может потребоваться изменить одинарные кавычки на двойные, чего делать нельзя в Unix или Plan 9. Вам также может потребоваться заменить один символ % на два %%.
Например:
# Unix
perl -e 'print "Hello world\n"'
# MS-DOS, etc.
perl -e "print \"Hello world\n\""
# VMS
perl -e "print ""Hello world\n""" Проблема в том, что ничто из этого не надёжно: это зависит от команды, и вполне возможно, ни одно из них не работает. Если 4DOS — это оболочка командной строки, это, вероятно, сработает лучше:
perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>"" CMD.EXE в Windows NT включил много стандартных функций Unix, когда никто не смотрел, но просто попытайтесь найти документацию по правилам цитирования.
Нет общего решения для всего этого. Это просто беспорядок.
Расположение Perl
Может показаться очевидным, но Perl полезен только тогда, когда пользователи могут легко его найти. По возможности, хорошо, чтобы как /usr/bin/perl, так и /usr/local/bin/perl были символическими ссылками на фактический двоичный файл. Если это невозможно, администраторам систем настоятельно рекомендуется поместить (символические ссылки на) perl и его вспомогательные утилиты в каталог, обычно включаемый в переменную среды PATH пользователя, или в другое очевидное и удобное место.
В этой документации #!/usr/bin/perl в первой строке программы будет использоваться для обозначения метода, который работает в вашей системе. Рекомендуется использовать конкретный путь, если вам нужна конкретная версия.
#!/usr/local/bin/perl5.14 или если вам нужно просто работать, по крайней мере, с версией, поместите такое утверждение в начало вашей программы:
use v5.14; Переключатели командной строки
Как и в случае со всеми стандартными командами, один символ переключателя может быть сгруппирован со следующим переключателем, если таковой имеется.
#!/usr/bin/perl -spi.orig # same as -s -p -i.orig -- сигнализирует об окончании параметров и отключает дальнейшую обработку параметров. Любые аргументы после -- рассматриваются как имена файлов и аргументы.
Переключатели включают:
- -0[octal/hexadecimal]
-
устанавливает разделитель записей входного файла (
$/) в виде восьмеричного или шестнадцатеричного числа. Если цифры отсутствуют, разделителем считается нулевой символ. Другие ключи могут предшествовать или следовать за цифрами. Например, если у вас есть версия find, которая может выводить имена файлов, завершённые нулевым символом, вы можете использовать такое обозначение:find . -name '*.orig' -print0 | perl -n0e unlinkОсобое значение 00 заставит Perl читать файлы в режиме абзацев.
Любое значение 0400 или выше заставит Perl читать файлы целиком, но по соглашению для этой цели обычно используется значение 0777. Флаг "-g" является более простым псевдонимом для него.
Вы также можете указать разделительный символ в шестнадцатеричном формате: -0xHHH..., где
H— допустимые шестнадцатеричные цифры. В отличие от восьмеричной формы, эта форма позволяет указать любой символ Юникода, даже те, которые находятся за пределами 0xFF. Таким образом, если вам действительно нужен разделитель записей 0777, укажите его как -0x1FF. (Это означает, что вы не можете использовать опцию "-x" с именем каталога, состоящим из шестнадцатеричных цифр, иначе Perl посчитает, что вы указали шестнадцатеричное число для -0.) - -a
-
включает режим авторазбиения при использовании с "-n" или "-p". Неявная команда разделения для массива @F выполняется в первую очередь внутри неявного цикла while, созданного "-n" или "-p".
perl -ane 'print pop(@F), "\n";'эквивалентно
while (<>) { @F = split(' '); print pop(@F), "\n"; }Альтернативный разделитель может быть задан с помощью -F.
-a неявным образом устанавливает "-n".
- -C [number/list]
-
Флаг -C управляет некоторыми функциями Perl Юникода.
Начиная с версии 5.8.1, за -C может следовать либо число, либо список буквенных опций. Буквы, их числовые значения и эффекты приведены ниже; перечисление букв равно сумме чисел.
I 1 STDIN is assumed to be in UTF-8 O 2 STDOUT will be in UTF-8 E 4 STDERR will be in UTF-8 S 7 I + O + E i 8 UTF-8 is the default PerlIO layer for input streams o 16 UTF-8 is the default PerlIO layer for output streams D 24 i + o A 32 the @ARGV elements are expected to be strings encoded in UTF-8 L 64 normally the "IOEioA" are unconditional, the L makes them conditional on the locale environment variables (the LC_ALL, LC_CTYPE, and LANG, in the order of decreasing precedence) -- if the variables indicate UTF-8, then the selected "IOEioA" are in effect a 256 Set ${^UTF8CACHE} to -1, to run the UTF-8 caching code in debugging mode.Например, -COE и -C6 оба включат UTF-8 для STDOUT и STDERR. Повторение букв — это просто избыточность, а не кумулятивность и не переключение.
Опции
ioозначают, что все последующие open() (или аналогичные операции ввода-вывода) в области основного программы будут иметь слой:utf8PerlIO, неявно применённый к ним, другими словами, ожидается 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) иopenpragma (см. open).(В версиях Perl, предшествующих 5.8.1, переключатель -C был переключателем только для Win32, который позволял использовать Unicode-совместимые Win32 API «широких системных вызовов». Однако эта функция практически не использовалась, поэтому переключатель командной строки был «переработан».)
Примечание: начиная с perl 5.10.1, если опция -C используется в строке
#!, она также должна быть указана в командной строке, так как стандартные потоки уже настроены на этом этапе выполнения интерпретатора perl. Вы также можете использовать binmode() для установки кодировки потока ввода-вывода. - -c
-
заставляет Perl проверить синтаксис программы, а затем выйти, не выполняя её. На самом деле, он будет выполнять любые
BEGIN,UNITCHECK, илиCHECKблоки и любыеuseоператоры: они рассматриваются как происходящие вне выполнения вашей программы.INITиENDблоки будут пропущены. - -d
- -dt
-
выполняет программу под отладчиком Perl. См. perldebug. Если t указано, это указывает отладчику, что в отлаживаемом коде будут использоваться потоки.
- -d:MOD[=bar,baz]
- -dt:MOD[=bar,baz]
-
выполняет программу под управлением модуля отладки, профилирования или отслеживания, установленного как
Devel::MOD. Например, -d:DProf выполняет программу с использованием профайлераDevel::DProf. Как и с флагом -M, опции могут быть переданы в пакетDevel::MOD, где они будут получены и интерпретированы процедуройDevel::MOD::import. Опять же, как и -M, используйте --d:-MOD для вызоваDevel::MOD::unimportвместо import. Список опций, разделённых запятыми, должен следовать за символом=. Если t указано, это указывает отладчику, что в отлаживаемом коде будут использоваться потоки. См. perldebug. - -Dletters
- -Dnumber
-
устанавливает флаги отладки. Этот переключатель включён только в том случае, если ваш бинарный файл perl был скомпилирован с включенной отладкой: в обычных производственных perl это не так.
Например, чтобы наблюдать за тем, как perl выполняет вашу программу, используйте -Dtls. Другое полезное значение — -Dx, которое отображает ваше скомпилированное синтаксическое дерево, и -Dr отображает скомпилированные регулярные выражения; формат вывода объясняется в perldebguts.
В качестве альтернативы, укажите число вместо списка букв (например, -D14 эквивалентно -Dtls):
1 p Tokenizing and parsing (with v, displays parse stack) 2 s Stack snapshots (with v, displays all stacks) 4 l Context (loop) stack processing 8 t Trace execution 16 o Method and overloading resolution 32 c String/numeric conversions 64 P Print profiling info, source file input state 128 m Memory and SV allocation 256 f Format processing 512 r Regular expression parsing and execution 1024 x Syntax tree dump 2048 u Tainting checks 4096 U Unofficial, User hacking (reserved for private, unreleased use) 8192 h Show hash randomization debug output (changes to PL_hash_rand_bits and their origin) 16384 X Scratchpad allocation 32768 D Cleaning up 65536 S Op slab allocation 131072 T Tokenizing 262144 R Include reference counts of dumped variables (eg when using -Ds) 524288 J show s,t,P-debug (don't Jump over) on opcodes within package DB 1048576 v Verbose: use in conjunction with other flags to increase the verbosity of the output. Is a no-op on many of the other flags 2097152 C Copy On Write 4194304 A Consistency checks on internal structures 8388608 q quiet - currently only suppresses the "EXECUTING" message 16777216 M trace smart match resolution 33554432 B dump suBroutine definitions, including special Blocks like BEGIN 67108864 L trace Locale-related info; what gets output is very subject to change 134217728 i trace PerlIO layer processing. Set PERLIO_DEBUG to the filename to trace to. 268435456 y trace y///, tr/// compilation and executionВсе эти флаги требуют -DDEBUGGING при компиляции исполняемого файла Perl (но см.
:opdв Devel::Peek или "'debug' mode" в re, которые могут это изменить). См. файл INSTALL в дистрибутиве исходного кода Perl, как это сделать.Если вы просто хотите получить вывод каждой строки кода Perl во время его выполнения, так как
sh -xпредоставляет для сценариев оболочки, вы не можете использовать переключатель -D Perl. Вместо этого сделайте так# If you have "env" utility env PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program # Bourne shell syntax $ PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program # csh syntax % (setenv PERLDB_OPTS "NonStop=1 AutoTrace=1 frame=2"; perl -dS program)См. perldebug для получения подробностей и вариаций.
- -e commandline
-
может использоваться для ввода одной строки программы. Если задано -e, Perl не будет искать имя файла в списке аргументов. Можно задать несколько команд -e для создания многострочного сценария. Убедитесь, что вы используете точки с запятой там, где их нужно в обычной программе.
- -E commandline
-
ведёт себя так же, как -e, за исключением того, что он неявно включает все дополнительные функции (в главном блоке компиляции). См. feature.
- -f
-
Отключает выполнение $Config{sitelib}/sitecustomize.pl при запуске.
Perl может быть скомпилирован так, что по умолчанию будет пытаться выполнить $Config{sitelib}/sitecustomize.pl при запуске (в блоке BEGIN). Это крючок, который позволяет системному администратору настроить поведение Perl. Например, он может использоваться для добавления записей в массив @INC, чтобы Perl находил модули в нестандартных расположениях.
Perl фактически вставляет следующий код:
BEGIN { do { local $!; -f "$Config{sitelib}/sitecustomize.pl"; } && do "$Config{sitelib}/sitecustomize.pl"; }Поскольку это фактический
do(а неrequire), sitecustomize.pl не нужно возвращать истинное значение. Код выполняется в пакетеmain, в своём собственном лексическом пространстве. Однако если сценарий завершается ошибкой,$@не будет установлено.Значение
$Config{sitelib}также определяется в коде C и не считывается изConfig.pm, который не загружается.Код выполняется очень рано. Например, любые изменения, внесённые в
@INC, будут отображаться в выводе `perl -V`. Конечно, блокиENDтакже будут выполняться очень поздно.Чтобы определить во время выполнения, включена ли эта функция в ваш perl, можно проверить значение
$Config{usesitecustomize}. - -Fpattern
-
устанавливает шаблон для разделения при использовании "-a". Шаблон может быть заключён в
//,"", или'', в противном случае он будет помещён в одинарные кавычки. Вы не можете использовать символы пробела или NUL в шаблоне. - -g
-
обнуляет разделитель записей входного файла (
$/) и тем самым включает режим чтения всего файла. Другими словами, он заставляет Perl читать файлы целиком сразу, а не построчно.Этот флаг — более простой псевдоним для -0777.
Мемоники: gobble, grab, gulp.
- -h
-
выводит краткое описание опций.
- -?
-
синоним для -h: выводит краткое описание опций.
- -i[extension]
-
указывает, что файлы, обрабатываемые конструкцией
<>, должны быть отредактированы на месте. Для этого происходит переименование входного файла, открытие выходного файла по первоначальному имени и выбор этого выходного файла в качестве значения по умолчанию для оператора print(). Расширение, если оно указано, используется для изменения имени старого файла с целью создания резервной копии, согласно следующим правилам:Если расширение не указано, и ваша система его поддерживает, исходный файл остается открытым без имени, в то время как вывод перенаправляется в новый файл с исходным именем файла. При завершении perl, вне зависимости от способа, исходный файл удаляется.
Если расширение не содержит
*, то оно добавляется к концу текущего имени файла в качестве суффикса. Если расширение содержит один или несколько символов*, то каждый*заменяется текущим именем файла. В терминах Perl это можно представить как:($backup = $extension) =~ s/\*/$file_name/g;Это позволяет добавить префикс к резервному файлу вместо (или в дополнение к) суффиксу:
$ perl -pi'orig_*' -e 's/bar/baz/' fileA # backup to # 'orig_fileA'Или даже разместить резервные копии исходных файлов в другой директории (при условии, что директория уже существует):
$ perl -pi'old/*.orig' -e 's/bar/baz/' fileA # backup to # 'old/fileA.orig'Эти наборы однострочных команд эквивалентны:
$ perl -pi -e 's/bar/baz/' fileA # overwrite current file $ perl -pi'*' -e 's/bar/baz/' fileA # overwrite current file $ perl -pi'.orig' -e 's/bar/baz/' fileA # backup to 'fileA.orig' $ perl -pi'*.orig' -e 's/bar/baz/' fileA # backup to 'fileA.orig'Из командной строки, набрав
$ perl -p -i.orig -e "s/foo/bar/; ... "то же самое, что использование программы:
#!/usr/bin/perl -pi.orig s/foo/bar/;что эквивалентно
#!/usr/bin/perl $extension = '.orig'; LINE: while (<>) { if ($ARGV ne $oldargv) { if ($extension !~ /\*/) { $backup = $ARGV . $extension; } else { ($backup = $extension) =~ s/\*/$ARGV/g; } rename($ARGV, $backup); open(ARGVOUT, ">$ARGV"); select(ARGVOUT); $oldargv = $ARGV; } s/foo/bar/; } continue { print; # this prints to original filename } select(STDOUT);за исключением того, что форма -i не нуждается в сравнении $ARGV с $oldargv, чтобы узнать, когда имя файла изменилось. Однако она использует ARGVOUT для выбранного файлового дескриптора. Обратите внимание, что STDOUT восстанавливается в качестве дескриптора выходного файла по умолчанию после цикла.
Как показано выше, Perl создаёт резервный файл независимо от того, были ли фактически изменены какие-либо выводы. Итак, это просто хитроумный способ копирования файлов:
$ perl -p -i'/some/file/path/*' -e 1 file1 file2 file3... or $ perl -p -i'.orig' -e 1 file1 file2 file3...Вы можете использовать
eofбез скобок для определения конца каждого входного файла, в случае если вы хотите добавить к каждому файлу или сбросить нумерацию строк (см. пример в "eof" в perlfunc).Если для данного файла Perl не может создать резервный файл в соответствии с указанным расширением, то он пропустит этот файл и продолжит работу со следующим (если он существует).
Для обсуждения проблем, связанных с правами доступа к файлам и параметром -i, см. "Почему Perl позволяет мне удалять файлы только для чтения? Почему -i перезаписывает защищенные файлы? Разве это ошибка в Perl?" в perlfaq5.
Вы не можете использовать -i для создания каталогов или удаления расширений из файлов.
Perl не расширяет
~в именах файлов, что хорошо, поскольку некоторые люди используют его для своих резервных файлов:$ perl -pi~ -e 's/foo/bar/' file1 file2 file3...Обратите внимание, что поскольку -i переименовывает или удаляет исходный файл перед созданием нового файла с тем же именем, Unix-стилевые мягкие и жёсткие ссылки не будут сохранены.
Наконец, переключатель -i не препятствует выполнению, когда на командной строке не указано никаких файлов. В этом случае резервная копия не создаётся (исходный файл, конечно, определить нельзя), и обработка происходит от STDIN к STDOUT, как можно ожидать.
- -Idirectory
-
Директории, указанные с помощью -I, добавляются в начало пути поиска модулей (
@INC). - -l[octnum]
-
включает автоматическую обработку окончания строк. Это оказывает два отдельных эффекта. Во-первых, он автоматически удаляет
$/(разделитель записей входного потока) при использовании с "-n" или "-p". Во-вторых, он присваивает$\(разделитель записей выходного потока) значение octnum, чтобы любые операторы print добавляли этот разделитель обратно. Если octnum опущено, устанавливает$\в текущее значение$/. Например, для обрезки строк до 80 столбцов:perl -lpe 'substr($_, 80) = ""'Обратите внимание, что присваивание
$\ = $/выполняется при обработке переключателя, поэтому разделитель записей входного потока может отличаться от разделителя записей выходного потока, если переключатель -l следует за переключателем -0:gnufind / -print0 | perl -ln0e 'print "found $_" if -p'Это устанавливает
$\в значение новой строки, а затем устанавливает$/в значение нулевого символа. - -m[-]module
- -M[-]module
- -M[-]'module ...'
- -[mM][-]module=arg[,arg]...
-
-mmodule выполняет
usemodule();перед выполнением вашей программы. Это загружает модуль, но не вызывает его методimport, поэтому не импортирует подпрограммы и не оказывает эффекта прагмы.-Mmodule выполняет
usemodule;перед выполнением вашей программы. Это загружает модуль и вызывает его методimport, вызывая его стандартное действие, обычно импорт подпрограмм или прагматическое действие. Вы можете использовать кавычки для добавления дополнительного кода после имени модуля, например'-MMODULE qw(foo bar)'.Если первый символ после -M или -m является тире (-), то 'use' заменяется на 'no'. Это не имеет значения для -m.
Некоторая встроенная синтаксическая конструкция означает, что вы также можете сказать -mMODULE=foo,bar или -MMODULE=foo,bar в качестве сокращения для '-MMODULE qw(foo bar)'. Это позволяет избежать необходимости использовать кавычки при импорте символов. Фактический код, генерируемый -MMODULE=foo,bar, выглядит как
use module split(/,/,q{foo,bar}). Обратите внимание, что форма=устраняет различие между -m и -M; то есть -mMODULE=foo,bar эквивалентно -MMODULE=foo,bar.Последствие формулировки
splitзаключается в том, что -MMODULE=number никогда не выполняет проверку версии, если толькоMODULE::import()не настроено на выполнение проверки версии, что может произойти, например, если MODULE наследует от Exporter. - -n
-
заставляет Perl предположить следующий цикл вокруг вашей программы, который заставляет её повторяться по аргументам имени файла, что-то вроде sed -n или awk:
LINE: while (<>) { ... # your program goes here }Обратите внимание, что строки не выводятся по умолчанию. См. "-p" для вывода строк. Если файл, указанный аргументом, не может быть открыт по какой-либо причине, Perl предупреждает вас об этом и переходит к следующему файлу.
Также обратите внимание, что
<>передаёт аргументы командной строки в "open" в perlfunc, которые не обязательно интерпретируются как имена файлов. См. perlop для возможных последствий для безопасности.Вот эффективный способ удаления всех файлов, которые не изменялись как минимум неделю:
find . -mtime +7 -print | perl -nle unlinkЭто быстрее, чем использование переключателя -exec команды find, потому что вам не нужно запускать процесс на каждом найденном имени файла (но это не быстрее, чем использование переключателя -delete, доступного в более новых версиях find. Оно страдает от ошибки неправильной обработки новых строк в именах путей, которую можно исправить, если вы следуете примеру под -0.
BEGINиENDблоки могут использоваться для захвата управления до или после неявного цикла программы, как и в awk. - -p
-
заставляет Perl предположить следующий цикл вокруг вашей программы, который заставляет её повторяться по аргументам имени файла, что-то вроде sed:
LINE: while (<>) { ... # your program goes here } continue { print or die "-p destination: $!\n"; }Если файл, указанный аргументом, не может быть открыт по какой-либо причине, Perl предупреждает вас об этом и переходит к следующему файлу. Обратите внимание, что строки выводятся автоматически. Ошибка при выводе обрабатывается как фатальная. Чтобы подавить вывод, используйте переключатель "-n". Переключатель -p переопределяет переключатель -n.
BEGINиENDблоки могут использоваться для захвата управления до или после неявного цикла, как и в awk. - -s
-
включает примитивный разбор переключателей для переключателей в командной строке после имени программы, но перед любыми аргументами имени файла (или перед аргументом --). Любой найденный переключатель удаляется из @ARGV и устанавливает соответствующую переменную в программе Perl в основном пакете. Следующая программа выводит "1", если программа вызвана с переключателем -xyz, и "abc", если она вызвана с -xyz=abc.
#!/usr/bin/perl -s if ($xyz) { print "$xyz\n" }Обратите внимание, что такой переключатель, как --help, создаёт переменную
${-help}, что не соответствуетuse strict "refs". Кроме того, при использовании этого параметра в сценарии с включёнными предупреждениями вы можете получить много ложных предупреждений "используется только один раз". По этим причинам использование -s не рекомендуется. См. Getopt::Long для более гибкого разбора переключателей. - -S
-
заставляет Perl использовать переменную окружения "PATH" для поиска программы, если имя программы не содержит разделителей путей.
На некоторых платформах это также заставляет Perl добавлять суффиксы к имени файла во время поиска. Например, на платформах Win32 добавляются суффиксы ".bat" и ".cmd", если поиск по исходному имени не дал результата и если имя не заканчивается на одном из этих суффиксов. Если ваш Perl был скомпилирован с
DEBUGGINGвключённым, использование переключателя -Dp в Perl показывает, как проходит поиск.Обычно это используется для эмуляции запуска
#!на платформах, которые не поддерживают#!. Это также удобно при отладке скрипта, который использует#!, и поэтому обычно находится механизмом поиска $PATH оболочки.Этот пример работает на многих платформах с оболочкой, совместимой с Bourne shell:
#!/usr/bin/perl eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}' if 0; # ^ Run only under a shellСистема игнорирует первую строку и отправляет программу в /bin/sh, который пытается выполнить программу Perl как скрипт оболочки. Оболочка выполняет вторую строку как обычную командную строку и, таким образом, запускает интерпретатор Perl. На некоторых системах $0 не всегда содержит полный путь, поэтому "-S" сообщает Perl искать программу при необходимости. После того, как Perl находит программу, она анализирует строки и игнорирует их, потому что проверка 'if 0' никогда не выполняется. Если программа будет интерпретироваться csh, вам нужно заменить
${1+"$@"}на$*, даже если это не понимает вложенные пробелы (и т. д.) в списке аргументов. Чтобы запустить sh вместо csh, на некоторых системах может потребоваться заменить строку#!на строку только с двоеточием, которая вежливо игнорируется Perl. Другие системы не могут контролировать это и требуют полностью хитрых конструкций, которые будут работать под любой из csh, sh или Perl, например, следующей:eval '(exit $?0)' && eval 'exec perl -wS $0 ${1+"$@"}' & eval 'exec /usr/bin/perl -wS $0 $argv:q' if 0; # ^ Run only under a shellЕсли имя файла содержит разделители каталогов (и, таким образом, является абсолютным или относительным путем), и если этот файл не найден, платформы, которые добавляют расширения файлов, сделают это и попытаются найти файл с добавленными расширениями по одному.
В платформах, подобных DOS, если программа не содержит разделителей каталогов, она сначала будет проверена в текущем каталоге, прежде чем будет проверена в переменной PATH. В платформах Unix программа будет проверена строго в переменной PATH.
- -t
-
Подобно "-T", но проверки на заражение будут выдавать предупреждения вместо фатальных ошибок. Эти предупреждения теперь можно контролировать стандартными средствами с помощью
no warnings qw(taint).Примечание: это не замена
-T! Это предназначено для использования только как временной помощи при разработке, при защите устаревшего кода: для реального производственного кода и для нового защищённого кода, написанного с нуля, всегда используйте реальный "-T".Это не имеет эффекта, если ваш perl был скомпилирован без поддержки проверки на заражение.
- -T
-
включает "заражение", чтобы вы могли их проверить. Обычно эти проверки выполняются только при запуске setuid или setgid. Это хорошая идея - включить их явно для программ, которые выполняются от имени другого пользователя, которому вы, возможно, не доверяете, таких как CGI-программы или любые интернет-серверы, которые вы можете написать на Perl. Подробности см. в perlsec. По соображениям безопасности этот параметр должен быть увиден Perl довольно рано; обычно это означает, что он должен появиться в начале командной строки или в строке
#!для систем, которые поддерживают эту конструкцию. - -u
-
Этот переключатель заставляет Perl сбрасывать core после компиляции вашей программы. Затем вы теоретически можете взять этот дамп core и преобразовать его в исполняемый файл с помощью программы undump (не поставляется). Это ускоряет запуск за счёт некоторого места на диске (которое можно минимизировать, удалив лишнее из исполняемого файла). (Тем не менее, исполняемый файл "hello world" занимает около 200 КБ на моём компьютере.) Если вы хотите выполнить часть вашей программы перед сбросом, используйте функцию
CORE::dump(). Примечание: доступность undump зависит от платформы и может быть недоступна для определённых портов Perl. - -U
-
разрешает Perl выполнять небезопасные операции. В настоящее время единственными "небезопасными" операциями являются попытки удалить каталоги при работе с правами суперпользователя и запуск программ с setuid, при которых проверки на заражение с фатальными ошибками превращены в предупреждения. Обратите внимание, что предупреждения должны быть включены вместе с этим параметром, чтобы сгенерировать предупреждения о проверке на заражение.
- -v
-
выводит версию и номер патча вашего исполняемого файла perl.
- -V
-
выводит сводку основных значений конфигурации perl и текущие значения @INC.
- -V:configvar
-
Выводит в STDOUT значение(я) заданной конфигурационной переменной(ых), несколько значений, когда ваш аргумент
configvarвыглядит как регулярное выражение (содержит небуквенные символы). Например:$ perl -V:libc libc='/lib/libc-2.2.4.so'; $ perl -V:lib. libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc'; libc='/lib/libc-2.2.4.so'; $ perl -V:lib.* libpth='/usr/local/lib /lib /usr/lib'; libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc'; lib_ext='.a'; libc='/lib/libc-2.2.4.so'; libperl='libperl.a'; ....Кроме того, дополнительные двоеточия могут использоваться для управления форматированием. Конечный двоеточие подавляет перевод строки и терминатор ";", позволяя вам встраивать запросы в командные строки. (мнемоника: разделитель PATH ":").
$ echo "compression-vars: " `perl -V:z.*: ` " are here !" compression-vars: zcat='' zip='zip' are here !Ведущее двоеточие удаляет часть "name=" из ответа, это позволяет вам сопоставить нужные вам имена. (мнемоника: пустая метка)
$ echo "goodvfork="`./perl -Ilib -V::usevfork` goodvfork=false;Ведущие и конечные двоеточия могут использоваться вместе, если вам нужны значения позиционных параметров без имён. Обратите внимание, что в приведённом ниже примере
PERL_APIпараметры возвращаются в алфавитном порядке.$ echo building_on `perl -V::osname: -V::PERL_API_.*:` now building_on 'linux' '5' '1' '9' now - -w
-
выводит предупреждения о сомнительных конструкциях, таких как имена переменных, упомянутые только один раз, и скалярные переменные, используемые до присвоения им значения; переопределённые подпрограммы; ссылки на неопределённые дескрипторы файлов; дескрипторы файлов, открытые только для чтения, на которые вы пытаетесь записать; значения, используемые как число, которое не выглядит как число; использование массива как скаляра; если ваши подпрограммы рекурсируют более чем на 100 уровней; и бесчисленные другие вещи.
Этот переключатель фактически просто включает глобальную переменную
$^W; обычно предпочтительнее использовать лексически-ограниченныйuse warningsпragma. Вы можете отключить или преобразовать в фатальные ошибки определённые предупреждения, используя__WARN__обработчики, как описано в perlvar и "warn" в perlfunc. См. также perldiag и perltrap. Также доступна детальная система предупреждений, если вы хотите манипулировать целыми классами предупреждений; см. warnings. - -W
-
Включает все предупреждения независимо от
no warningsили$^W. См. warnings. - -X
-
Отключает все предупреждения независимо от
use warningsили$^W. См. warnings.Запрещено в
"PERL5OPT". - -x
- -xdirectory
-
указывает Perl, что программа встроена в больший кусок не связанного текста, например, в сообщении электронной почты. Незначащий текст будет отброшен до первой строки, начинающейся с
#!и содержащей строку "perl". Любые значимые переключатели в этой строке будут применены.Все ссылки на номера строк программой (предупреждения, ошибки и т. д.) будут обрабатывать
#!строку как первую строку. Таким образом, предупреждение на 2-й строке программы, которая находится на 100-й строке в файле, будет сообщено как на 2-й строке, а не на 100-й. Это можно переопределить, используя директиву#line. (См. "Plain Old Comments (Not!)" в perlsyn)Если указано имя каталога, Perl переключится на этот каталог перед запуском программы. Переключатель -x управляет только удалением предварительного мусора. Программа должна завершаться с помощью
__END__в случае наличия конечного мусора, который нужно игнорировать; программа может обработать весь или любой из конечного мусора через дескриптор файлаDATAпо желанию.Если указан каталог, он должен стоять сразу после -x без пробелов между ними.
Окружение
- HOME
-
Используется, если
chdirне имеет аргумента. - LOGDIR
-
Используется, если
chdirне имеет аргумента и "HOME" не задан. - PATH
-
Используется при выполнении дочерних процессов и поиске программы, если используется "-S".
- PERL5LIB
-
Список каталогов, в которых следует искать файлы библиотек Perl, прежде чем обращаться к стандартной библиотеке. Любые каталоги, специфичные для архитектуры и версии, такие как version/archname/, version/ или archname/ в указанных расположениях, автоматически включаются, если они существуют, и этот поиск выполняется во время запуска интерпретатора. Кроме того, добавляются все каталоги, соответствующие записям в
$Config{inc_version_list}. (Обычно это каталоги для устаревших совместимых версий Perl, установленных в той же иерархии каталогов.)Если PERL5LIB не определен, используется "PERLLIB". Каталоги разделяются (как в PATH) двоеточием на платформах Unix-подобных системах и точкой с запятой на Windows (правильный разделитель пути задаётся командой
perl -V:path_sep).При выполнении проверок на утечку данных, либо потому, что программа работала с правами setuid или setgid, либо был указан переключатель "-T" или "-t", переменные PERL5LIB и "PERLLIB" не используются. Программа должна вместо этого сказать:
use lib "/my/directory"; - PERL5OPT
-
Опции командной строки (переключатели). Переключатели в этой переменной обрабатываются так, как если бы они были в каждой строке команд Perl. Разрешены только переключатели -[CDIMTUWdmtw]. При выполнении проверок на утечку данных (либо потому, что программа работала с правами setuid или setgid, либо был использован переключатель "-T" или "-t") эта переменная игнорируется. Если PERL5OPT начинается с -T, проверка на утечку включена, а последующие опции игнорируются. Если PERL5OPT начинается с -t, проверка на утечку включена, запись "dot" в @INC удаляется, а последующие опции учитываются.
- PERLIO
-
Список слоёв PerlIO, разделённый пробелами (или двоеточиями). Если Perl был скомпилирован для использования системы PerlIO для ввода-вывода (по умолчанию), эти слои влияют на ввод-вывод Perl.
Обычным способом является начало имён слоёв с двоеточия (например,
:perlio) для акцентирования на их сходстве с «атрибутами» переменных. Но код, который анализирует строки спецификаций слоёв, также используемый для декодирования переменной среды PERLIO, рассматривает двоеточие как разделитель.Не заданный или пустой PERLIO эквивалентен набору по умолчанию слоёв для вашей платформы; например,
:unix:perlioна системах Unix-подобных и:unix:crlfна Windows и других системах DOS-подобных.Список становится по умолчанию для всех вводов-выводов Perl. Следовательно, в этом списке могут находиться только встроенные слои, так как внешним слоям (например,
:encoding()) нужен ввод-вывод для их загрузки! Смотрите "pragma open" для того, как добавить внешние кодировки как значения по умолчанию.Ниже кратко описаны слои, которые имеет смысл включать в переменную среды PERLIO. Для получения более подробной информации, см. PerlIO.
- :crlf
-
Слой, который выполняет преобразование CRLF в
"\n"перевод, различая файлы «текстовые» и «двоичные» в соответствии с MS-DOS и аналогичными операционными системами, а также обеспечивает буферизацию, подобную:perlioна этих архитектурах. - :perlio
-
Это повторная реализация буферизации типа stdio, написанная как слой PerlIO. Таким образом, она будет вызывать любой слой ниже её для своих операций, обычно
:unix. - :stdio
-
Этот слой предоставляет интерфейс PerlIO, обёрткой вызовов системной библиотеки ANSI C «stdio». Слой обеспечивает как буферизацию, так и ввод-вывод. Обратите внимание, что слой
:stdioне выполняет преобразование CRLF, даже если это стандартное поведение платформы. Вам потребуется слой:crlfнад ним для этого. - :unix
-
Базовый слой, который вызывает
read,write,lseek, и т.д.
Набор слоёв по умолчанию должен давать приемлемые результаты на всех платформах.
На платформах Unix это будет эквивалентно ":unix:perlio" или ":stdio". Конфигурация настроена так, чтобы отдавать предпочтение реализации ":stdio", если системная библиотека предоставляет быстрый доступ к буферу (необычно для современных архитектур); в противном случае используется реализация ":unix:perlio".
В Win32 по умолчанию в этом релизе (5.30) является ":unix:crlf". В Win32 ":stdio" имеет ряд ошибок/недостатков для ввода-вывода Perl, которые зависят от версии и поставщика компилятора C. Использование нашего собственного слоя
:crlfв качестве буфера позволяет избежать этих проблем и делает всё более однородным.В этом релизе (5.30) используется
:unixкак нижний слой в Win32, и поэтому всё ещё используются числовые системные функции файла компилятора C.Переменная среды PERLIO полностью игнорируется при запуске Perl в режиме проверки целостности.
- PERLIO_DEBUG
-
Если установлено имя файла или устройства при запуске Perl с переключателем командной строки -Di, регистрация определённых операций подсистемы PerlIO будет перенаправлена в указанный файл, а не в stderr, что является значением по умолчанию. Файл открывается в режиме добавления.
Типичные примеры в Unix:
% env PERLIO_DEBUG=/tmp/perlio.log perl -Di script ...и приблизительно эквивалентный для Win32:
> set PERLIO_DEBUG=CON perl -Di script ...Эта функция отключена для скриптов с правами setuid, для скриптов, запущенных с "-T", и для скриптов на Perl, скомпилированном без поддержки
-DDEBUGGING. - PERLLIB
-
Список каталогов, в которых следует искать файлы библиотек Perl, прежде чем обращаться к стандартной библиотеке. Если определён "PERL5LIB", PERLLIB не используется.
Переменная среды PERLLIB полностью игнорируется при запуске Perl в режиме проверки целостности.
- PERL5DB
-
Команда для загрузки кода отладчика. По умолчанию:
BEGIN { require "perl5db.pl" }Переменная среды PERL5DB используется только при запуске Perl с переключателем "-d".
- PERL5DB_THREADED
-
Если установлено в истинное значение, указывает отладчику, что отлаживаемый код использует потоки.
- PERL5SHELL (специфично для порта Win32)
-
Только для портов Win32, может быть установлен на альтернативную оболочку, которую Perl должен использовать для выполнения команд «backtick» или system(). Значение по умолчанию
cmd.exe /x/d/cдля WindowsNT иcommand.com /cдля Windows95. Значение рассматривается как разделённое пробелами. Перед любым символом, который нужно защитить, например, пробелом или обратной косой чертой, ставится ещё одна обратная косая черта.Обратите внимание, что Perl не использует COMSPEC для этой цели, поскольку COMSPEC имеет высокую степень вариативности среди пользователей, что вызывает проблемы с переносимостью. Кроме того, Perl может использовать оболочку, которая может не подходить для интерактивного использования, а установка COMSPEC на такую оболочку может помешать правильному функционированию других программ (которые обычно ищут в COMSPEC оболочку, подходящую для интерактивного использования).
До Perl 5.10.0 и 5.8.8 PERL5SHELL не проверялся на утечку данных при выполнении внешних команд. Рекомендуется явно устанавливать (или удалять)
$ENV{PERL5SHELL}при запуске в режиме проверки целостности на Windows. - PERL_ALLOW_NON_IFS_LSP (специфично для порта Win32)
-
Установлено в 1 для разрешения использования LSP (Layered Service Providers), несовместимых с IFS. Perl обычно ищет LSP, совместимый с IFS, поскольку это необходимо для эмуляции Windows-сокеттов как реальных дескрипторов файлов. Однако это может вызвать проблемы, если у вас есть брандмауэр, такой как McAfee Guardian, который требует, чтобы все приложения использовали его LSP, но который не совместим с IFS, так как очевидно, что Perl обычно избегает использования такого LSP.
Установка этой переменной среды в 1 означает, что Perl просто использует первый подходящий LSP, перечисленный в каталоге, что делает McAfee Guardian счастливым — и в этом конкретном случае Perl всё ещё работает, поскольку McAfee Guardian фактически играет другие игры, которые позволяют приложениям, требующим совместимости с IFS, работать.
- PERL_DEBUG_MSTATS
-
Актуально только если Perl скомпилирован с включением
malloc, которое входит в дистрибутив Perl; то есть, еслиperl -V:d_mymallocимеет значение "define".Если установлено, выводит статистику памяти после выполнения. Если установлено значение, большее 1, выводит статистику памяти и после компиляции.
- PERL_DESTRUCT_LEVEL
-
Управляет поведением глобального уничтожения объектов и других ссылок. Смотрите "PERL_DESTRUCT_LEVEL" в perlhacktips для получения дополнительной информации.
- PERL_DL_NONLAZY
-
Установлено в
"1"для того, чтобы Perl разрешал все неопределённые символы при загрузке динамической библиотеки. По умолчанию символы разрешаются при их использовании. Установка этой переменной полезна во время тестирования расширений, так как она гарантирует получение ошибки при неправильном написании имён функций, даже если набор тестов их не вызывает. - PERL_ENCODING
-
При использовании псевдонима
use encodingбез явного имени кодировки, в качестве имени кодировки используется переменная среды PERL_ENCODING. - PERL_HASH_SEED
-
(С Perl 5.8.1, новые семантика в Perl 5.18.0) Используется для переопределения случайного характера внутренней хэш-функции Perl. Значение выражается в шестнадцатеричном виде и может содержать префикс 0x. Усечённые шаблоны обрабатываются так, как будто к ним добавлено необходимое число нулей.
Если эта опция задана, а
PERL_PERTURB_KEYSНЕ установлено, то значение '0' подразумеваетPERL_PERTURB_KEYS=0/PERL_PERTURB_KEYS=NO, а любое другое значение подразумеваетPERL_PERTURB_KEYS=2/PERL_PERTURB_KEYS=DETERMINISTIC. Смотрите документацию для PERL_PERTURB_KEYS для важных замечаний относительно режимаDETERMINISTIC.ВАЖНО: seed хэша — это чувствительная информация. Хэши случайны для защиты от локальных и удалённых атак на код Perl. Ручное задание seed может частично или полностью лишить защиты.
Смотрите "Атаки на алгоритмическую сложность" в perlsec, "PERL_PERTURB_KEYS" и "PERL_HASH_SEED_DEBUG" для получения дополнительной информации.
- PERL_PERTURB_KEYS
-
(С Perl 5.18.0) Установка в
"0"или"NO", затем перебор ключей будет повторяться от запуска к запуску для того жеPERL_HASH_SEED. Вставка в хеш не изменит порядок, за исключением обеспечения большего пространства в хеше. В сочетании с установкой PERL_HASH_SEED этот режим максимально приближен к поведению до версии 5.18.При установке в
"1"или"RANDOM", перебор ключей будет случайным. Каждый раз при вставке хеша в порядке ключей будут случайные изменения. Порядок может не повторяться при последующем запуске программы, даже если указан PERL_HASH_SEED. Это режим по умолчанию для Perl, если явно не задан PERL_HASH_SEED.При установке в
"2"или"DETERMINISTIC", вставка ключей в хеш приведет к изменению порядка ключей, но таким образом, который повторяется от запуска к запуску программы, при условии, что используется тот же семенной хеш и что код не выполняет никаких не детерминированных операций и также при точно таком же контексте среды. Добавление или удаление переменной окружения может и, скорее всего, изменит порядок ключей. Если любая часть кода создает хеш с использованием не детерминированных ключей, например, хеш с ключами в виде строковой формы ссылки или адреса содержащих его объектов, это может и, скорее всего, окажет глобальное влияние на порядок ключей *всех* хешей в процессе. Для корректной работы этот параметр ОБЯЗАТЕЛЬНО должен быть связан с PERL_HASH_SEED для получения детерминированных результатов, и, фактически, если вы явно устанавливаетеPERL_HASH_SEED, вам не нужно устанавливать его также, он будет автоматически установлен в этот режим.ПРИМЕЧАНИЕ: Использование этого параметра считается небезопасным и предназначено только для отладки не детерминированного поведения функции хеширования Perl. Не используйте его в производственной среде.
См. "Атаки на алгоритмическую сложность" в perlsec и "PERL_HASH_SEED" и "PERL_HASH_SEED_DEBUG" для получения дополнительной информации. Получить и установить маску перебора ключей для определенного хеша можно с помощью функции
hash_traversal_mask()из Hash::Util. - PERL_HASH_SEED_DEBUG
-
(С Perl 5.8.1.) Установка в
"1"отобразит (в STDERR) информацию о функции хеширования, зерне и о типе случайной выборки перебора ключей, действующей в начале выполнения. Это, в сочетании с "PERL_HASH_SEED" и "PERL_PERTURB_KEYS", предназначено для помощи в отладке не детерминированного поведения, вызванного случайной выборкой хеширования.Примечание, что любая информация о функции хеширования, особенно зерне хеширования, является чувствительной информацией: зная ее, можно организовать атаку с отказом от обслуживания против кода Perl, даже удаленно; см. "Атаки на алгоритмическую сложность" в perlsec для получения дополнительной информации. Не разглашайте зерно хеширования людям, которым это не нужно знать. См. также
hash_seed()иhash_traversal_mask().Пример вывода:
HASH_FUNCTION = ONE_AT_A_TIME_HARD HASH_SEED = 0x652e9b9349a7a032 PERTURB_KEYS = 1 (RANDOM) - PERL_MEM_LOG
-
Если ваш Perl был сконфигурирован с -Accflags=-DPERL_MEM_LOG, установка переменной среды
PERL_MEM_LOGвключает протоколирование сообщений отладки. Значение имеет вид<number>[m][s][t], гдеnumber— номер дескриптора файла, в который нужно записать (2 — по умолчанию), а комбинация букв указывает, что вам нужна информация о (m)emory и/или (s)v, необязательно с (t)imestamps. Например,PERL_MEM_LOG=1mstзаписывает всю информацию в stdout. Вы можете записывать в другие открытые дескрипторы файлов различными способами:$ 3>foo3 PERL_MEM_LOG=3m perl ... - PERL_ROOT (специфично для порта VMS)
-
Зашифрованное по трансляции логическое имя с корнем, содержащее Perl и логическое устройство для пути @INC только для VMS. Другие логические имена, влияющие на Perl на VMS, включают PERLSHR, PERL_ENV_TABLES и SYS$TIMEZONE_DIFFERENTIAL, но они необязательны и обсуждаются подробнее в perlvms и в README.vms в дистрибутиве Perl.
- PERL_SIGNALS
-
Доступно в Perls 5.8.1 и более поздних версиях. Если установлено в
"unsafe", восстанавливается поведение сигналов до Perl-5.8.0 (которое является непосредственным, но небезопасным). Если установлено вsafe, используются безопасные (но отложенные) сигналы. См. "Отложенные сигналы (безопасные сигналы)" в perlipc. - PERL_UNICODE
-
Эквивалентно параметру командной строки -C. Обратите внимание, что это не булева переменная. Установка этого значения в
"1"не является правильным способом «включения Unicode» (что бы это ни значило). Вы можете использовать"0"для «отключения Unicode» (или, альтернативно, снимите PERL_UNICODE в своей оболочке перед запуском Perl). См. описание параметра -C для получения дополнительной информации. - PERL_USE_UNSAFE_INC
-
Если Perl был сконфигурирован так, чтобы текущая директория не находилась в
@INCпо умолчанию, эту переменную можно установить в"1"для ее восстановления. Она в основном предназначена для использования при сборке и тестировании модулей, которые не были обновлены для работы без «.» в@INCи не должна устанавливаться в среде для повседневного использования. - SYS$LOGIN (специфично для порта VMS)
-
Используется, если chdir не имеет аргумента и "HOME" и "LOGDIR" не заданы.
- PERL_INTERNAL_RAND_SEED
-
Установите в целое неотрицательное число для инициализации генератора случайных чисел, используемого Perl внутри для различных целей.
Игнорируется, если Perl запускается с setuid или setgid. Используется только для некоторой ограниченной случайной выборки запуска (ключа хеша), если
-Tили-tPerl запущен с включенным таинством.Perl может быть скомпилирован так, чтобы игнорировать эту переменную.
Perl также имеет переменные среды, которые контролируют, как Perl обрабатывает данные, специфичные для конкретных языков; см. perllocale.
Perl и его различные модули и компоненты, включая его фреймворки тестирования, иногда могут использовать некоторые другие переменные среды. Некоторые из них специфичны для определённой платформы. Обратитесь к соответствующей документации по модулям и документации по вашей платформе (например, perlsolaris, perllinux, perlmacosx, perlwin32 и т. д.) для переменных, специфичных для этих ситуаций.
Perl предоставляет все переменные среды выполняемой программе и передает их всем дочерним процессам, которые она запускает. Однако программам, работающим с setuid, следует выполнить следующие строки перед выполнением каких-либо других действий, просто чтобы всё было честно:
$ENV{PATH} = "/bin:/usr/bin"; # or whatever you need
$ENV{SHELL} = "/bin/sh" if exists $ENV{SHELL};
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; ПОРЯДОК ПРИМЕНЕНИЯ
Некоторые параметры, в частности -I, -M, PERL5LIB и PERL5OPT могут взаимодействовать, и порядок их применения важен.
Обратите внимание, что этот раздел не документирует, что действительно происходит внутри интерпретатора Perl, он документирует, что эффективно происходит.
- -I
-
Эффект нескольких параметров
-Iзаключается вunshiftих в@INCсправа налево. Например:perl -I 1 -I 2 -I 3сначала добавит
3к началу@INC, затем добавит2, и затем добавит1. Результатом является то, что@INCначинается с:qw(1 2 3) - -M
-
Несколько параметров
-Mобрабатываются слева направо. Таким образом, это:perl -Mlib=1 -Mlib=2 -Mlib=3сначала использует pragma lib для добавления
1к@INC, затем добавит2, затем добавит3, что приведет к@INC, которая начинается с:qw(3 2 1) - переменная среды PERL5LIB
-
Содержит список каталогов, разделенных двоеточиями. Весь список добавляется к
@INCединовременно. Это:PERL5LIB=1:2:3 perlприведёт к
@INC, которая начинается с:qw(1 2 3) - комбинации -I, -M и PERL5LIB
-
PERL5LIBприменяется в первую очередь, затем все параметры-I, затем все параметры-M. Это:PERL5LIB=e1:e2 perl -I i1 -Mlib=m1 -I i2 -Mlib=m2приведёт к
@INC, которая начинается с:qw(m2 m1 i1 i2 e1 e2) - переменная среды PERL5OPT
-
Содержит список параметров, разделённых пробелами. В этом разделе мы рассматриваем только эффекты
-Mи-I.После обычной обработки параметров
-Iиз командной строки, все параметры-IвPERL5OPTизвлекаются. Они обрабатываются слева направо, а не справа налево. Также обратите внимание, что хотя пробелы допускаются между параметром-Iи его каталогом в командной строке, они не допускаются вPERL5OPT.После обычной обработки параметров
-Mиз командной строки, все параметры-MвPERL5OPTизвлекаются. Они обрабатываются слева направо, т.е., также как и те, которые указаны в командной строке.Пример может прояснить это:
export PERL5OPT="-Mlib=optm1 -Iopti1 -Mlib=optm2 -Iopti2" export PERL5LIB=e1:e2 perl -I i1 -Mlib=m1 -I i2 -Mlib=m2приведет к
@INC, которая начинается с:qw( optm2 optm1 m2 m1 opti2 opti1 i1 i2 e1 e2 ) - Другие осложнения
-
Существуют некоторые осложнения, которые игнорируются в приведённых выше примерах:
- подкаталоги arch и version
-
Все
-I,PERL5LIBиuse libтакже добавят подкаталоги arch и version, если они присутствуют - sitecustomize.pl
© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.36.0/perlrun