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