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.) -
Передается неявно через стандартный ввод. Это работает только в том случае, если нет аргументов имени файла — для передачи аргументов программе, читающей STDIN, необходимо явно указать «-» в качестве имени программы.
При методах 2 и 3 Perl начинает обработку файла ввода с начала, если вы не указали переключатель -x, в этом случае он ищет первую строку, начинающуюся с #! и содержащую слово «perl», и начинает с нее. Это полезно для запуска программы, встроенной в более крупное сообщение. (В этом случае вы укажете конец программы с помощью маркера __END__)
Строка #! всегда проверяется на наличие переключателей во время разбора строки. Таким образом, если вы находитесь на машине, которая допускает только один аргумент со строкой #!, или что еще хуже, не распознает строку #!, вы по-прежнему можете получить согласованное поведение переключателей независимо от того, как был вызван Perl, даже если -x использовался для нахождения начала программы.
Поскольку в некоторых операционных системах исторически ядро молча отсекало интерпретацию ядром строки #! после 32 символов, некоторые переключатели могут передаваться в командной строке, а некоторые — нет; вы даже можете получить «-» без своей буквы, если не будете осторожны. Вы, вероятно, хотите убедиться, что все ваши переключатели находятся либо до, либо после этого 32-символьного раздела. Большинство переключателей на самом деле не заботятся о том, обрабатываются ли они дублированно, но получение «-» вместо полного переключателя может заставить Perl попытаться выполнить стандартный ввод вместо вашей программы. А частичный переключатель -I также может привести к странным результатам.
Некоторые переключатели заботятся о том, обрабатываются ли они дважды, например, комбинации -l и -0. Либо поместите все переключатели после 32-символьного раздела (если применимо), либо замените использование -0цифры на 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. Это немного странно, но это помогает людям на машинах, которые не выполняют #!, потому что они могут сказать программе, что их оболочка — /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() (или аналогичные операции ввода/вывода) в текущей области файла будут иметь:utf8слой PerlIO неявно применённый к ним, другими словами, 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).(В Perлах, более ранних, чем 5.8.1, переключатель -C был переключателем только для Win32, который позволял использовать Unicode-совместимые API "широких системных вызовов" Win32. Однако эта функция практически не использовалась, и поэтому переключатель командной строки был «переработан».)
Примечание: Начиная с Perl 5.10.1, если опция -C используется в строке
#!, она также должна быть указана в командной строке, так как стандартные потоки уже настроены на этом этапе выполнения интерпретатора Perl. Вы также можете использовать binmode() для установки кодировки потока ввода/вывода. - -c
-
заставляет Perl проверять синтаксис программы, а затем завершать выполнение без ее запуска. На самом деле, он будет выполнять все
BEGIN,UNITCHECK, илиCHECKблоки и любыеuseинструкции: они рассматриваются как происходящие вне выполнения вашей программы.INITиENDблоки, однако, будут пропущены. - -d
- -dt
-
выполняет программу под отладчиком Perl. См. perldebug. Если указан t, это указывает отладчику, что в отлаживаемом коде будут использоваться потоки.
- -d:MOD[=bar,baz]
- -dt:MOD[=bar,baz]
-
выполняет программу под управлением модуля отладки, профилирования или трассировки, установленного как
Devel::MOD. Например, -d:DProf выполняет программу с использованием профилировщикаDevel::DProf. Как и с флагом -M, опции могут быть переданы в пакетDevel::MOD, где они будут приняты и интерпретированы процедуройDevel::MOD::import. Опять же, как и -M, используйте --d:-MOD для вызоваDevel::MOD::unimportвместо импорта. Список опций, разделённых запятыми, должен следовать за символом=. Если указан t, это указывает отладчику, что в отлаживаемом коде будут использоваться потоки. См. perldebug. - -Dletters
- -Dnumber
-
устанавливает флаги отладки. Этот переключатель включен только в том случае, если ваш двоичный файл perl был скомпилирован с включённой отладкой: нормальные производственные версии perl не будут.
Например, чтобы наблюдать за тем, как perl выполняет вашу программу, используйте -Dtls. Другое полезное значение — -Dx, которое выводит вашу скомпилированную синтаксическое дерево, и -Dr отображает скомпилированные регулярные выражения; формат вывода описан в perldebguts.
В качестве альтернативы, укажите число вместо списка символов (например, -D14 эквивалентно -Dtls):
1 p Tokenizing and parsing (with v, displays parse stack) 2 s Stack snapshots (with v, displays all stacks) 4 l Context (loop) stack processing 8 t Trace execution 16 o Method and overloading resolution 32 c String/numeric conversions 64 P Print profiling info, source file input state 128 m Memory and SV allocation 256 f Format processing 512 r Regular expression parsing and execution 1024 x Syntax tree dump 2048 u Tainting checks 4096 U Unofficial, User hacking (reserved for private, unreleased use) 16384 X Scratchpad allocation 32768 D Cleaning up 65536 S Op slab allocation 131072 T Tokenizing 262144 R Include reference counts of dumped variables (eg when using -Ds) 524288 J show s,t,P-debug (don't Jump over) on opcodes within package DB 1048576 v Verbose: use in conjunction with other flags to increase the verbosity of the output. Is a no-op on many of the other flags 2097152 C Copy On Write 4194304 A Consistency checks on internal structures 8388608 q quiet - currently only suppresses the "EXECUTING" message 16777216 M trace smart match resolution 33554432 B dump suBroutine definitions, including special Blocks like BEGIN 67108864 L trace Locale-related info; what gets output is very subject to change 134217728 i trace PerlIO layer processing. Set PERLIO_DEBUG to the filename to trace to.Все эти флаги требуют -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, см. в "Почему Perl позволяет мне удалять файлы только для чтения? Почему -i перезаписывает защищенные файлы? Разве это ошибка в Perl?" в perlfaq5.
Вы не можете использовать -i для создания каталогов или удаления расширений из файлов.
Perl не расширяет
~в именах файлов, что хорошо, так как некоторые люди используют его для своих резервных файлов:$ perl -pi~ -e 's/foo/bar/' file1 file2 file3...Обратите внимание, что поскольку -i переименовывает или удаляет исходный файл перед созданием нового файла с тем же именем, Unix-стилевые мягкие и жёсткие ссылки не будут сохранены.
Наконец, переключатель -i не препятствует выполнению, когда на командной строке нет файлов. В этом случае резервная копия не создается (исходный файл, конечно, определить нельзя), и обработка продолжается от STDIN до STDOUT, как можно ожидать.
- -Iкаталог
-
Директории, указанные с помощью -I, добавляются в начало пути поиска модулей (
@INC). - -l[восьмеричное число]
-
включает автоматическую обработку окончания строк. Она имеет два отдельных эффекта. Во-первых, она автоматически обрезает
$/(разделитель записей ввода) при использовании с -n или -p. Во-вторых, она устанавливает$\(разделитель записей вывода) в значение восьмеричного числа, так что все операторы print получат этот разделитель обратно. Если восьмеричное число опущено, устанавливает$\в текущее значение$/. Например, для обрезки строк до 80 столбцов:perl -lpe 'substr($_, 80) = ""'Обратите внимание, что присваивание
$\ = $/выполняется при обработке переключателя, поэтому разделитель записей ввода может отличаться от разделителя записей вывода, если переключатель -l следует за переключателем -0:gnufind / -print0 | perl -ln0e 'print "found $_" if -p'Это устанавливает
$\в новую строку, а затем устанавливает$/в нулевой символ. - -m[-]модуль
- -M[-]модуль
- -M[-]'модуль ...'
- -[mM][-]модуль=арг[,арг]...
-
-mмодуль выполняет
useмодуль();перед выполнением вашей программы. Это загружает модуль, но не вызывает его методimport, поэтому не импортирует подпрограммы и не оказывает воздействия на прагму.-Mмодуль выполняет
useмодуль;перед выполнением вашей программы. Это загружает модуль и вызывает его методimport, вызывая у модуля его стандартное действие, обычно импортируя подпрограммы или оказывая влияние на прагму. Вы можете использовать кавычки, чтобы добавить дополнительный код после имени модуля, например,'-MMODULE qw(foo bar)'.Если первый символ после -M или -m является тире (-), то 'use' заменяется на 'no'. Это не имеет значения для -m.
Небольшая встроенная синтаксическая конструкция означает, что вы также можете сказать -mМОДУЛЬ=foo,bar или -MМОДУЛЬ=foo,bar в качестве сокращения для '-MМОДУЛЬ qw(foo bar)'. Это позволяет избежать необходимости использовать кавычки при импорте символов. Фактический код, сгенерированный -MМОДУЛЬ=foo,bar, это
use module split(/,/,q{foo,bar}). Обратите внимание, что форма=устраняет различие между -m и -M; то есть, -mМОДУЛЬ=foo,bar то же самое, что и -MМОДУЛЬ=foo,bar.Следствие формулировки
splitзаключается в том, что -MМОДУЛЬ=число никогда не выполняет проверку версии, если толькоMODULE::import()сам не настроен на проверку версии, что может произойти, например, если МОДУЛЬ унаследован от Exporter. - -n
-
принуждает Perl предположить следующий цикл вокруг вашей программы, который заставляет её итерироваться по аргументам имен файлов, подобно sed -n или awk:
LINE: while (<>) { ... # your program goes here }Обратите внимание, что строки по умолчанию не выводятся. См. "-p", чтобы выводить строки. Если файл с именем, указанным аргументом, не может быть открыт по какой-либо причине, Perl предупредит вас об этом и перейдет к следующему файлу.
Также обратите внимание, что
<>передает аргументы командной строки в "open" в perlfunc, что не обязательно интерпретирует их как имена файлов. См. perlop для возможных последствий для безопасности.Вот эффективный способ удалить все файлы, которые не изменялись в течение хотя бы недели:
find . -mtime +7 -print | perl -nle unlinkЭто быстрее, чем использование переключателя -exec команды find, потому что вам не нужно запускать процесс для каждого найденного имени файла (но это не быстрее, чем использование переключателя -delete, доступного в более новых версиях find. Оно страдает от ошибки неправильной обработки новых строк в именах путей, которую можно исправить, если вы следуете примеру в разделе -0.
BEGINиENDблоки могут быть использованы для захвата управления до или после неявного цикла программы, как и в awk. - -p
-
принуждает Perl предположить следующий цикл вокруг вашей программы, который заставляет её итерироваться по аргументам имен файлов, подобно sed:
LINE: while (<>) { ... # your program goes here } continue { print or die "-p destination: $!\n"; }Если файл с именем, указанным аргументом, не может быть открыт по какой-либо причине, Perl предупредит вас об этом и перейдет к следующему файлу. Обратите внимание, что строки автоматически выводятся. Ошибка при выводе считается фатальной. Для подавления вывода используйте переключатель -n. Переключатель -p переопределяет переключатель -n.
BEGINиENDблоки могут быть использованы для захвата управления до или после неявного цикла, как и в awk. - -s
-
включает примитивный синтаксический анализ переключателей для переключателей в командной строке после имени программы, но перед любыми аргументами имен файлов (или перед аргументом --). Любой найденный переключатель удаляется из @ARGV и устанавливает соответствующую переменную в программе Perl. Следующая программа выводит "1", если программа вызывается с переключателем -xyz, и "abc", если она вызывается с -xyz=abc.
#!/usr/bin/perl -s if ($xyz) { print "$xyz\n" }Обратите внимание, что такой переключатель, как --help, создаёт переменную
${-help}, что не соответствуетuse strict "refs". Кроме того, при использовании этого параметра в скрипте с включенными предупреждениями вы можете получить много ложных предупреждений "использовался только один раз". - -S
-
заставляет Perl использовать переменную окружения PATH для поиска программы, если имя программы не содержит разделителей пути.
На некоторых платформах это также заставляет Perl добавлять суффиксы к имени файла во время поиска. Например, на платформах Win32 добавляются суффиксы ".bat" и ".cmd", если поиск по исходному имени не увенчался успехом и если имя не заканчивается на один из этих суффиксов. Если ваш Perl был скомпилирован с
DEBUGGINGвключённым, использование переключателя -Dp в Perl показывает, как происходит поиск.Обычно это используется для эмуляции
#!запуска на платформах, которые не поддерживают#!. Это также удобно при отладке скрипта, который использует#!, и поэтому обычно обнаруживается механизмом поиска $PATH оболочки.Этот пример работает на многих платформах с оболочкой, совместимой с оболочкой Bourne:
#!/usr/bin/perl eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}' if $running_under_some_shell;Система игнорирует первую строку и отправляет программу в /bin/sh, который пытается выполнить Perl-программу как скрипт оболочки. Оболочка выполняет вторую строку как обычную команду оболочки и тем самым запускает интерпретатор Perl. На некоторых системах $0 не всегда содержит полный путь, поэтому -S говорит Perl выполнить поиск программы при необходимости. После того, как Perl найдёт программу, он проанализирует строки и проигнорирует их, поскольку переменная $running_under_some_shell никогда не является истинной. Если программа будет интерпретироваться csh, вам нужно заменить
${1+"$@"}на$*, даже если она не понимает вложенных пробелов (и т. п.) в списке аргументов. Чтобы запустить sh вместо csh, на некоторых системах может потребоваться заменить строку#!строкой, содержащей только двоеточие, которое Perl вежливо проигнорирует. Другие системы не могут контролировать это и нуждаются в полностью хитроумной конструкции, которая будет работать под csh, sh или Perl, например, следующей:eval '(exit $?0)' && eval 'exec perl -wS $0 ${1+"$@"}' & eval 'exec /usr/bin/perl -wS $0 $argv:q' if $running_under_some_shell;Если имя файла содержит разделители каталогов (и, таким образом, является абсолютным или относительным именем пути), и если этот файл не найден, платформы, которые добавляют расширения файлов, будут делать это и пытаться найти файл с добавленными расширениями по одному.
В платформах, подобных DOS, если программа не содержит разделителей каталогов, она сначала будет искаться в текущем каталоге, а затем в каталоге PATH. В платформах Unix программа будет искаться исключительно в каталоге PATH.
- -t
-
Подобно -T, но проверки на заражение будут генерировать предупреждения, а не фатальные ошибки. Теперь эти предупреждения можно контролировать стандартными средствами с помощью
no warnings qw(taint).Примечание: это не замена
-T! Это предназначено только для временной помощи при разработке, обеспечивающей совместимость с устаревшим кодом: для реального кода производства и для нового защищённого кода, написанного с нуля, всегда используйте реальный -T. - -T
-
включает «заражение», чтобы вы могли их проверить. Обычно эти проверки выполняются только при запуске setuid или setgid. Хорошей идеей является явное включение их для программ, которые выполняются от имени кого-то другого, кому вы не обязательно доверяете, например, CGI-программ или любых интернет-серверов, которые вы можете написать на Perl. Подробности см. в perlsec. По соображениям безопасности этот параметр должен быть замечен Perl достаточно рано; обычно это означает, что он должен появиться в начале командной строки или в строке
#!для систем, которые поддерживают эту конструкцию. - -u
-
Этот переключатель заставляет Perl сбросить ядро после компиляции вашей программы. Затем теоретически вы можете взять этот дамп ядра и преобразовать его в исполняемый файл с помощью программы undump (не предоставляется). Это ускоряет запуск в ущерб некоторому объёму дискового пространства (которое вы можете минимизировать, удалив исполняемый файл). (Тем не менее, исполняемый файл «hello world» на моей машине занимает около 200 Кб.) Если вы хотите выполнить часть вашей программы до сброса, используйте функцию
CORE::dump()вместо этого. Примечание: наличие undump зависит от платформы и может быть недоступно для конкретного порта Perl. - -U
-
разрешает Perl выполнять небезопасные операции. В настоящее время единственными «небезопасными» операциями являются попытка удалить каталоги при запуске от имени суперпользователя и запуск программ setuid с превращением фатальных проверок заражения в предупреждения. Обратите внимание, что предупреждения должны быть включены вместе с этим параметром, чтобы фактически вызывать предупреждения о проверке заражения.
- -v
-
выводит версию и номер патча вашего исполняемого файла Perl.
- -V
-
выводит сводку основных значений конфигурации Perl и текущих значений @INC.
- -V:configvar
-
Выводит в стандартный вывод значение заданной переменной конфигурации (переменных), с множественными значениями, когда ваш аргумент
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; обычно предпочтительным является лексически ограниченное использование pragmause 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. Допускаются только переключатели -[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.
- :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 IO, которые зависят от версии и поставщика компилятора 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 должен использовать для выполнения команд «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, чтобы разрешить использование несовместимых с IFS LSP (Layered Service Providers). Perl обычно ищет LSP, совместимый с IFS, потому что это необходимо для эмуляции Windows-сокет как реальных файловых дескрипторов. Однако это может вызвать проблемы, если у вас есть брандмауэр, например, McAfee Guardian, который требует, чтобы все приложения использовали его LSP, но который не совместим с IFS, потому что Perl обычно будет избегать использования такого LSP.
Установка этой переменной среды в 1 означает, что Perl просто использует первый подходящий LSP, перечисленный в каталоге, что делает McAfee Guardian счастливым — и в этом конкретном случае Perl также работает, потому что McAfee Guardian фактически играет в другие игры, которые позволяют приложениям, требующим совместимости с IFS, работать.
- PERL_DEBUG_MSTATS
-
Актуально только если Perl был скомпилирован с
malloc, включёнными в дистрибутив Perl; то есть, еслиperl -V:d_mymallocравно «define».Если установлено, то выводятся статистические данные памяти после выполнения. Если установлено значение больше единицы, то выводятся статистические данные памяти и после компиляции.
- PERL_DESTRUCT_LEVEL
-
Актуально только если ваш исполняемый файл Perl был скомпилирован с -DDEBUGGING, это контролирует поведение глобального уничтожения объектов и других ссылок. Для получения дополнительной информации см. "PERL_DESTRUCT_LEVEL" в perlhacktips.
- PERL_DL_NONLAZY
-
Установите в
"1", чтобы Perl разрешал все неопределённые символы при загрузке динамической библиотеки. Поведение по умолчанию заключается в разрешении символов при их использовании. Установка этой переменной полезна во время тестирования расширений, так как она гарантирует, что вы получите ошибку при неправильном написании имён функций, даже если набор тестов не вызывает их. - PERL_ENCODING
-
Если используется pragma
use encodingбез явного имени кодировки, переменная среды PERL_ENCODING используется для получения имени кодировки. - PERL_HASH_SEED
-
(С Perl 5.8.1, новые семантики в Perl 5.18.0) Используется для переопределения рандомизации внутренней функции хеширования Perl. Значение выражается в шестнадцатеричном формате и может включать лидирующую 0x. Обрезанные шаблоны обрабатываются так, как будто они дополнены необходимым количеством нулей.
Если опция указана, и
PERL_PERTURB_KEYSНЕ установлена, то значение '0' подразумеваетPERL_PERTURB_KEYS=0, а любое другое значение подразумеваетPERL_PERTURB_KEYS=2.ВАЖНО: Семена хеширования — конфиденциальная информация. Хеши рандомизируются для защиты от локальных и удаленных атак на код 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.30.3/perlrun