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