perlfunc
СОДЕРЖАНИЕ
НАЗВАНИЕ
perlfunc - встроенные функции Perl
ОПИСАНИЕ
Функции в этом разделе могут использоваться в качестве терминов в выражении. Они делятся на две основные категории: операторы списков и именованные унарные операторы. Они отличаются по своему отношению к приоритету с последующей запятой. (См. таблицу приоритетов в perlop.) Операторы списков принимают более одного аргумента, а унарные операторы никогда не принимают более одного аргумента. Таким образом, запятая завершает аргумент унарного оператора, но просто разделяет аргументы оператора списка. Унарный оператор обычно предоставляет скалярный контекст своему аргументу, а оператор списка может предоставлять скалярный или списковый контексты для своих аргументов. Если он делает и то, и другое, скалярные аргументы идут первыми, а за ними следует списковый аргумент, и может быть только один такой списковый аргумент. Например, splice имеет три скалярных аргумента, за которыми следует список, тогда как gethostbyname имеет четыре скалярных аргумента.
В последующих описаниях синтаксиса операторы списков, ожидающие список (и предоставляющие списковый контекст для элементов списка), показаны с аргументом LIST. Такой список может состоять из любой комбинации скалярных аргументов или списковых значений; списковые значения будут включены в список так, как будто каждый отдельный элемент был интерполирован в этом месте в списке, образуя более длинное одномерное значение списка. Запятые должны разделять литеральные элементы списка LIST.
Любую функцию из списка ниже можно использовать как с круглыми скобками вокруг её аргументов, так и без них. (Описания синтаксиса опускают скобки.) Если вы используете скобки, то простое, но иногда неожиданное правило таково: выглядит как функция, значит это функция, и приоритет значения не имеет. В противном случае это оператор списка или унарный оператор, и приоритет имеет значение. Пробелы между функцией и левой круглой скобкой не учитываются, поэтому иногда нужно быть осторожным:
print 1+2+4; # Prints 7.
print(1+2) + 4; # Prints 3.
print (1+2)+4; # Also prints 3!
print +(1+2)+4; # Prints 7.
print ((1+2)+4); # Prints 7. Если вы запускаете Perl с прагмой use warnings, она может предупредить вас об этом. Например, третья строка выше даёт:
print (...) interpreted as function at - line 1.
Useless use of integer addition in void context at - line 1. Некоторые функции вообще не принимают аргументов и, следовательно, не являются ни унарными, ни операторами списка. К ним относятся такие функции, как time и endpwent. Например, time+86_400 всегда означает time() + 86_400.
Для функций, которые могут использоваться как в скалярном, так и в списковом контекстах, неабортивное завершение в скалярном контексте, как правило, обозначается возвратом неопределённого значения, а в списковом контексте — возвратом пустого списка.
Помните следующее важное правило: нет правила, которое связывает поведение выражения в списковом контексте с его поведением в скалярном контексте, и наоборот. Оно может делать две совершенно разные вещи. Каждый оператор и функция решают, какой тип значения было бы наиболее подходящим для возврата в скалярном контексте. Некоторые операторы возвращают длину списка, который был бы возвращён в списковом контексте. Некоторые операторы возвращают первое значение в списке. Некоторые операторы возвращают последнее значение в списке. Некоторые операторы возвращают счётчик успешных операций. В общем, они делают то, что вы хотите, если только вы не хотите последовательности.
Именованный массив в скалярном контексте отличается от того, что на первый взгляд кажется списком в скалярном контексте. Вы не можете получить список, подобный (1,2,3) в скалярном контексте, потому что компилятор знает контекст во время компиляции. Он сгенерирует скалярный оператор запятой, а не версию конкатенации списка с запятой. Это означает, что это изначально никогда не был список.
В общем, функции Perl, которые служат оболочками для системных вызовов («syscalls») с тем же именем (например, chown(2), fork(2), closedir(2) и т. д.) возвращают true при успехе и undef в противном случае, как обычно упоминается в описаниях ниже. Это отличается от интерфейсов C, которые возвращают -1 при ошибке. К исключениям из этого правила относятся wait, waitpid и syscall. Системные вызовы также устанавливают специальную переменную $! при ошибке. Другие функции этого не делают, за исключением случайного совпадения.
Модули расширения также могут подключаться к парсеру Perl для определения новых типов выражений с ключевыми словами. Они могут выглядеть как функции, но также могут выглядеть совершенно по-другому. Синтаксис после ключевого слова определяется полностью расширением. Если вы разработчик расширений, см. "PL_keyword_plugin" в perlapi для получения механизма. Если вы используете такой модуль, обратитесь к документации модуля за подробностями о синтаксисе, который он определяет.
Функции Perl по категориям
Вот функции Perl (включая вещи, которые выглядят как функции, такие как некоторые ключевые слова и именованные операторы), сгруппированные по категориям. Некоторые функции появляются в нескольких местах. Любые предупреждения, включая те, которые генерируются ключевыми словами, описаны в perldiag и warnings.
- Функции для SCALAR или строк
-
chomp,chop,chr,crypt,fc,hex,index,lc,lcfirst,length,oct,ord,pack,q//,qq//,reverse,rindex,sprintf,substr,tr///,uc,ucfirst,y///fcдоступна только если включен"fc"или если она имеет префиксCORE::."fc"автоматически включается с объявлениемuse v5.16(или выше) в текущей области видимости. - Регулярные выражения и сопоставление с шаблонами
- Числовые функции
-
abs,atan2,cos,exp,hex,int,log,oct,rand,sin,sqrt,srand - Функции для массивов @ARRAY
- Функции для данных списков
- Функции для ассоциативных массивов %HASH
- Функции ввода-вывода
-
binmode,close,closedir,dbmclose,dbmopen,die,eof,fileno,flock,format,getc,print,printf,read,readdir,readline,rewinddir,say,seek,seekdir,select,syscall,sysread,sysseek,syswrite,tell,telldir,truncate,warn,writesayдоступна только если включен"say"или если она имеет префиксCORE::."say"автоматически включается с объявлениемuse v5.10(или выше) в текущей области видимости. - Функции для данных фиксированной длины или записей
-
pack,read,syscall,sysread,sysseek,syswrite,unpack,vec - Функции для дескрипторов файлов, файлов или каталогов
-
-X,chdir,chmod,chown,chroot,fcntl,glob,ioctl,link,lstat,mkdir,open,opendir,readlink,rename,rmdir,select,stat,symlink,sysopen,umask,unlink,utime -
break,caller,continue,die,do,dump,eval,evalbytes,exit,__FILE__,goto,last,__LINE__,method,next,__PACKAGE__,redo,return,sub,__SUB__,wantarraybreakдоступна только при включении экспериментальной функции"switch"или использовании префиксаCORE::."switch"также включает в себя операторыdefault,givenиwhen, которые описаны в "Операторы switch" в perlsyn."switch"автоматически включается с объявлениемuse v5.10(или выше) в текущей области видимости. В Perl v5.14 и более ранних версиях,continueтребовала"switch"функции, как и другие ключевые слова.evalbytesдоступна только с функцией"evalbytes"(см. feature) или если имеет префиксCORE::.__SUB__доступна только с функцией"current_sub"или если имеет префиксCORE::. Обе функции"evalbytes"и"current_sub"автоматически включаются с объявлениемuse v5.16(или выше) в текущей области видимости.
-
caller,class,field,import,local,my,our,package,state,usestateдоступен только в том случае, если функция"state"включена, или если она имеет префиксCORE::. Функция"state"включается автоматически с объявлениемuse v5.10(или выше) в текущем области видимости. - Функции общего назначения
- Функции для процессов и групп процессов
-
alarm,exec,fork,getpgrp,getppid,getpriority,kill,pipe,qx//,readpipe,setpgrp,setpriority,sleep,system,times,wait,waitpid -
bless,class,dbmclose,dbmopen,field,method,package,ref,tie,tied,untie,use - Функции низкого уровня для сокетов
-
accept,bind,connect,getpeername,getsockname,getsockopt,listen,recv,send,setsockopt,shutdown,socket,socketpair - Функции межпроцессного взаимодействия System V
-
msgctl,msgget,msgrcv,msgsnd,semctl,semget,semop,shmctl,shmget,shmread,shmwrite - Получение информации о пользователях и группах
-
endgrent,endhostent,endnetent,endpwent,getgrent,getgrgid,getgrnam,getlogin,getpwent,getpwnam,getpwuid,setgrent,setpwent - Получение сетевой информации
-
endprotoent,endservent,gethostbyaddr,gethostbyname,gethostent,getnetbyaddr,getnetbyname,getnetent,getprotobyname,getprotobynumber,getprotoent,getservbyname,getservbyport,getservent,sethostent,setnetent,setprotoent,setservent - Ключевые слова, не являющиеся функциями
-
ADJUST,and,AUTOLOAD,BEGIN,catch,CHECK,cmp,CORE,__DATA__,default,defer,DESTROY,else,elseif,elsif,END,__END__,eq,finally,for,foreach,ge,given,gt,if,INIT,isa,le,lt,ne,not,or,try,UNITCHECK,unless,until,when,while,x,xor
Портативность
Perl был разработан для Unix и поэтому может получать доступ ко всем распространённым системным вызовам Unix. В не-Unix средах функциональность некоторых системных вызовов Unix может быть недоступна или детали доступной функциональности могут незначительно отличаться. Функции Perl, на которые это может повлиять:
-X, binmode, chmod, chown, chroot, crypt, dbmclose, dbmopen, dump, endgrent, endhostent, endnetent, endprotoent, endpwent, endservent, exec, fcntl, flock, fork, getgrent, getgrgid, gethostbyname, gethostent, getlogin, getnetbyaddr, getnetbyname, getnetent, getppid, getpgrp, getpriority, getprotobynumber, getprotoent, getpwent, getpwnam, getpwuid, getservbyport, getservent, getsockopt, glob, ioctl, kill, link, lstat, msgctl, msgget, msgrcv, msgsnd, open, pipe, readlink, rename, select, semctl, semget, semop, setgrent, sethostent, setnetent, setpgrp, setpriority, setprotoent, setpwent, setservent, setsockopt, shmctl, shmget, shmread, shmwrite, socket, socketpair, stat, symlink, syscall, sysopen, system, times, truncate, umask, unlink, utime, wait, waitpid
Для получения дополнительной информации о переносимости этих функций, см. perlport и другую доступную платформенно-специфическую документацию.
Алфавитный список функций Perl
- -X FILEHANDLE
- -X EXPR
- -X DIRHANDLE
- -X
-
Тест файла, где X — одна из букв, перечисленных ниже. Этот унарный оператор принимает один аргумент: имя файла, дескриптор файла или дескриптор каталога и проверяет связанный файл, чтобы определить, верно ли какое-либо утверждение о нём. Если аргумент опущен, тестируется
$_, за исключением-t, которая проверяет STDIN. За исключением случаев, описанных в документации, возвращает1для истинности и''для ложности. Если файл не существует или его невозможно проверить, возвращаетundefи устанавливает$!(errno). За исключением теста-l, все они следуют символичным ссылкам, поскольку используютstat(), а неlstat()(поэтому висячие символичные ссылки не могут быть проверены и, следовательно, сообщат об ошибке).Несмотря на забавные имена, приоритет такой же, как и у любого другого именованного унарного оператора. Оператор может быть любым из:
-r File is readable by effective uid/gid. -w File is writable by effective uid/gid. -x File is executable by effective uid/gid. -o File is owned by effective uid. -R File is readable by real uid/gid. -W File is writable by real uid/gid. -X File is executable by real uid/gid. -O File is owned by real uid. -e File exists. -z File has zero size (is empty). -s File has nonzero size (returns size in bytes). -f File is a plain file. -d File is a directory. -l File is a symbolic link (false if symlinks aren't supported by the file system). -p File is a named pipe (FIFO), or Filehandle is a pipe. -S File is a socket. -b File is a block special file. -c File is a character special file. -t Filehandle is opened to a tty. -u File has setuid bit set. -g File has setgid bit set. -k File has sticky bit set. -T File is an ASCII or UTF-8 text file (heuristic guess). -B File is a "binary" file (opposite of -T). -M Script start time minus file modification time, in days. -A Same for access time. -C Same for inode change time (Unix, may differ for other platforms)Пример:
while (<>) { chomp; next unless -f $_; # ignore specials #... }Обратите внимание, что
-s/a/b/не выполняет отрицательной замены. Однако-exp($foo)по-прежнему работает как ожидается: только одиночные буквы, следующие за минусом, интерпретируются как тесты файлов.Эти операторы исключаются из правила «выглядит как функция», описанного выше. То есть открывающая скобка после оператора не влияет на то, какой объём последующего кода образует аргумент. Поместите открывающую скобку перед оператором, чтобы отделить его от последующего кода (это относится только к операторам с более высоким приоритетом, чем унарные операторы, конечно):
-s($file) + 1024 # probably wrong; same as -s($file + 1024) (-s $file) + 1024 # correctИнтерпретация операторов разрешений доступа к файлам
-r,-R,-w,-W,-x, и-Xпо умолчанию основана только на режиме файла и идентификаторах пользователей и групп пользователя. Могут быть и другие причины, по которым вы не можете действительно читать, писать или выполнять файл: например, сетевые контролы доступа к файловой системе, ACL (списки управления доступом), файловые системы только для чтения и нераспознанные форматы исполняемых файлов. Обратите внимание, что использование этих шести конкретных операторов для проверки возможности выполнения какой-либо операции обычно является ошибкой, поскольку оно может быть уязвимо к гонкам.Также обратите внимание, что для суперпользователя на локальных файловых системах тесты
-r,-R,-w, и-Wвсегда возвращают 1, а-xи-Xвозвращают 1, если в режиме установлен какой-либо бит выполнения. Таким образом, скриптам, выполняемым суперпользователем, может потребоваться выполнитьstatдля определения фактического режима файла или временного изменения их эффективного идентификатора пользователя на что-то другое.Если вы используете ACL, существует pragma под названием
filetest, которое может давать более точные результаты, чем обычные биты режимаstat. При использованииuse filetest 'access', вышеупомянутые тесты файлов проверяют, может ли разрешение быть предоставлено с помощью семейства системных вызовов access(2). Также обратите внимание, что тесты-xи-Xпри использовании данного pragma могут возвращать true, даже если нет установленных битов разрешения на выполнение (и нет дополнительных разрешений на выполнение в ACL). Эта странность обусловлена определениями базовых системных вызовов. Также обратите внимание, что из-за реализацииuse filetest 'access', специальный дескриптор файла_не будет кэшировать результаты тестов файлов при активном использовании этого pragma. Прочитайте документацию для pragmafiletestдля получения дополнительной информации.Тесты
-Tи-Bработают следующим образом. Первый блок или так далее файла проверяется на наличие допустимого UTF-8, включающего не ASCII-символы. Если это так, то это-Tфайл. В противном случае та же часть файла проверяется на наличие необычных символов, таких как странные управляющие коды или символы с установленным старшим битом. Если более одной трети символов являются странными, это-Bфайл; в противном случае это-Tфайл. Также любой файл, содержащий нулевой байт в проверенной части, считается двоичным файлом. (Если выполняется в контексте use locale, включающемLC_CTYPE, необычными символами являются все символы, которые не являются печатаемыми или пробелами в текущей локали.) Если-Tили-Bиспользуются с дескриптором файла, проверяется текущий буфер ввода-вывода, а не первый блок. Оба-Tи-Bвозвращают true для пустого файла или файла в конце файла (EOF) при тестировании дескриптора файла. Поскольку для выполнения теста-Tнеобходимо прочитать файл, в большинстве случаев вы хотите сначала использовать-fдля файла, как вnext unless -f $file && -T $file.Если любой из тестов файлов (или операторы
statилиlstat) получает специальный дескриптор файла, состоящий из единственной подчёркивания, то используется структура stat предыдущего теста файла (или оператораstat), что экономит системный вызов. (Это не работает с-t, и вам нужно помнить, чтоlstatи-lоставляют значения в структуре stat для символичной ссылки, а не для реального файла.) (Также, если буфер stat был заполнен вызовомlstat,-Tи-Bперезаполнят его результатамиstat _). Пример:print "Can do.\n" if -r $a || -w _ || -x _; stat($filename); print "Readable\n" if -r _; print "Writable\n" if -w _; print "Executable\n" if -x _; print "Setuid\n" if -u _; print "Setgid\n" if -g _; print "Sticky\n" if -k _; print "Text\n" if -T _; print "Binary\n" if -B _;Начиная с Perl 5.10.0, как форма чисто синтаксического сахара, вы можете объединить операторы тестов файлов таким образом, что
-f -w -x $fileэквивалентно-x $file && -w _ && -f _. (Это только интересный синтаксис: если вы используете возвращаемое значение-f $fileв качестве аргумента для другого оператора теста файлов, никакого особого волшебства не произойдёт).Проблемы с переносимостью: "-X" в perlport.
Чтобы избежать путаницы у будущих пользователей вашего кода с непонятными синтаксическими ошибками, поместите что-то вроде этого в начале вашего скрипта:
use v5.10; # so filetest ops can stack - abs VALUE
- abs
-
Возвращает абсолютное значение своего аргумента. Если VALUE опущен, используется
$_. - accept NEWSOCKET,GENERICSOCKET
-
Принимает входящее подключение к сокету, так же, как и accept(2). Возвращает упакованный адрес, если операция успешна, в противном случае — ложь. См. пример в "Sockets: Клиент/Сервер-Связь" в perlipc.
В системах, которые поддерживают флаг close-on-exec для файлов, флаг будет установлен для нового открытого дескриптора файла, как определено значением
$^F. См. "$^F" в perlvar. - alarm SECONDS
- alarm
-
Назначает доставку сигнала SIGALRM данному процессу после истечения заданного количества секунд реального времени. Если SECONDS не указан, используется значение, хранящееся в
$_. (К сожалению, на некоторых машинах фактически прошедшее время может быть на секунду меньше или больше, чем вы указали, из-за того, как считаются секунды, а планировщик процессов может еще больше задержать доставку сигнала.)Одновременно может отсчитываться только один таймер. Каждый вызов отключает предыдущий таймер, и аргумент
0может быть передан для отмены предыдущего таймера без запуска нового. Возвращаемое значение — остаток времени предыдущего таймера.Для задержек с большей точностью, чем одна секунда, модуль Time::HiRes (из CPAN, начиная с Perl 5.8, входит в стандартное распределение) предоставляет
ualarm. Вы также можете использовать четырехаргументную версию Perlselect, оставив первые три аргумента неопределёнными, или вы можете использовать интерфейсsyscallдля доступа к setitimer(2), если ваша система его поддерживает. Подробнее см. perlfaq8.Обычно не следует смешивать вызовы
alarmиsleep, посколькуsleepможет быть реализован на вашей системе с использованиемalarm.Если вы хотите использовать
alarmдля таймаута системного вызова, вам необходимо использовать паруeval/die. Вы не можете полагаться на то, что alarm вызовет ошибку системного вызова, с$!, установленным вEINTR, потому что Perl устанавливает обработчики сигналов для перезапуска системных вызовов на некоторых системах. Использованиеeval/dieвсегда работает, за исключением оговорок, указанных в "Сигналы" в perlipc.eval { local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required alarm $timeout; my $nread = sysread $socket, $buffer, $size; alarm 0; }; if ($@) { die unless $@ eq "alarm\n"; # propagate unexpected errors # timed out } else { # didn't }Дополнительную информацию см. в perlipc.
Проблемы с переносимостью: "alarm" в perlport.
- atan2 Y,X
-
Возвращает арктангенс Y/X в диапазоне от -PI до PI.
Для операции тангенса вы можете использовать функцию
Math::Trig::tanили использовать хорошо известное соотношение:sub tan { sin($_[0]) / cos($_[0]) }Возвращаемое значение для
atan2(0,0)определяется реализацией; см. страницу справки atan2(3) для получения дополнительной информации.Проблемы с переносимостью: "atan2" в perlport.
- bind SOCKET,NAME
-
Связывает сетевой адрес с сокетом, так же, как и bind(2). Возвращает true, если операция выполнена успешно, false в противном случае. NAME должен быть упакованным адресом соответствующего типа для сокета. Смотрите примеры в "Sockets: Клиент/Сервер-Связь" в perlipc.
- binmode FILEHANDLE, LAYER
- binmode FILEHANDLE
-
Обеспечивает чтение или запись FILEHANDLE в режиме "двоичный" или "текстовый" на системах, где исполняемые библиотеки различают двоичные и текстовые файлы. Если FILEHANDLE является выражением, значение принимается как имя файлового дескриптора. Возвращает true при успехе, в противном случае возвращает
undefи устанавливает$!(errno).На некоторых системах (в основном, системах на базе DOS и Windows)
binmodeнеобходимо, когда вы работаете не с текстовым файлом. Ради переносимости рекомендуется всегда использовать его, когда это уместно, и никогда не использовать, когда это неуместно. Кроме того, пользователи могут настроить свой ввод/вывод по умолчанию с кодировкой UTF-8 Unicode, а не байтами.Другими словами: независимо от платформы, используйте
binmodeдля двоичных данных, таких как изображения.Если LAYER присутствует, это строка, но может содержать несколько директив. Директивы изменяют поведение файлового дескриптора. Когда LAYER присутствует, использование binmode для текстового файла имеет смысл.
Если LAYER отсутствует или указан как
:raw, файловый дескриптор подходит для передачи двоичных данных. Это включает отключение возможного преобразования CRLF и маркировку как байты (в отличие от символов Unicode). Обратите внимание, что, несмотря на то, что может подразумеваться в «Программирование на Perl» (версия с верблюдом, 3-е издание) или где-либо еще,:rawне является просто обратным:crlf. Другие уровни, которые повлияют на двоичную природу потока, также будут отключены. См. PerlIO и обсуждение переменной среды PERLIO в perlrun.:bytes,:crlf,:utf8, и любые другие директивы в формате:...называются слоями ввода-вывода.Параметр LAYER функции
binmodeописывается как «ДИСЦИПЛИНА» в «Программирование на Perl, 3-е издание». Однако с момента публикации этой книги, известной многим как «Верблюд III», консенсус в отношении именования этой функциональности перешел от «дисциплины» к «слою». Поэтому вся документация этой версии Perl относится к «слоям», а не к «дисциплинам». Теперь вернемся к обычному расписанию документации…Для маркировки FILEHANDLE как UTF-8 используйте
:utf8или:encoding(UTF-8).:utf8просто отмечает данные как UTF-8 без дальнейшей проверки, а:encoding(UTF-8)проверяет данные на соответствие действительным данным UTF-8. Более подробную информацию можно найти в PerlIO::encoding.В общем случае,
binmodeследует вызывать послеopen, но до выполнения любых операций ввода-вывода с файловым дескриптором. Вызовbinmodeобычно сбрасывает все ожидающие данные буферизованного вывода (и, возможно, ожидающие данные ввода) в дескрипторе. Исключением является слой:encoding, который изменяет кодировку символов по умолчанию дескриптора. Слой:encodingиногда необходимо вызывать во время выполнения, и он не сбрасывает поток.:encodingтакже неявным образом добавляет наверх слой:utf8, поскольку Perl внутренне работает с символами Unicode в кодировке UTF-8.Операционная система, драйверы устройств, библиотеки C и система выполнения Perl объединяют усилия, позволяя программисту обрабатывать один символ (
\n) как разделитель строк, независимо от внешнего представления. На многих операционных системах родное текстовое представление файла соответствует внутреннему представлению, но на некоторых платформах внешнее представление\nсостоит из более чем одного символа.Все варианты Unix, Mac OS (старые и новые), и файлы Stream_LF в VMS используют один символ для завершения каждой строки во внешнем представлении текста (даже если этот один символ – возврат каретки в старых версиях Mac OS до Darwin и перевод строки в Unix и большинстве файлов VMS). В других системах, таких как OS/2, DOS и различных вариантах MS Windows, ваша программа видит
\nкак простой\cJ, но в текстовых файлах хранятся два символа\cM\cJ. Это означает, что если вы не используетеbinmodeна этих системах, последовательности\cM\cJна диске будут преобразованы в\nпри вводе, а любые\nв вашей программе будут преобразованы обратно в\cM\cJпри выводе. Это нужно для текстовых файлов, но может быть катастрофичным для двоичных файлов.Еще одним следствием использования
binmode(на некоторых системах) является то, что специальные маркеры конца файла будут восприниматься как часть потока данных. Для систем семейства Microsoft это означает, что если ваши двоичные данные содержат\cZ, подсистема ввода-вывода будет рассматривать это как конец файла, если вы не используетеbinmode.binmodeважен не только для операцийreadlineиprint, но и при использованииread,seek,sysread,syswriteиtell(см. perlport для более подробной информации). См. переменные$/и$\в perlvar, чтобы вручную установить последовательности завершения строки для ввода и вывода.Проблемы переносимости: "binmode" в perlport.
- bless REF,CLASSNAME
- bless REF
-
blessуказывает Perl на то, чтобы пометить элемент, на который ссылаетсяREF, как объект в пакете. Двухаргументная формаblessпредпочтительнее всегда, если нет конкретной причины, чтобы этого не делать.-
Благословение связанного элемента в определенный пакет (рекомендуемая форма):
bless $ref, $package;Двухаргументная форма добавляет объект в пакет, указанный во втором аргументе.
-
Благословение связанного элемента в пакет
main.bless $ref, "";Если второй аргумент пустая строка,
blessдобавляет объект в пакетmain. -
Благословение связанного элемента в текущий пакет (не наследуется):
bless $ref;Если
blessиспользуется без второго аргумента, объект создается в текущем пакете. Второй аргумент всегда должен быть предоставлен, если производный класс может унаследовать метод, выполняющийbless. Из-за потенциальных ошибок использованиеblessс одним аргументом не рекомендуется.
См. perlobj для более подробной информации о благословении (и благословениях) объектов.
blessвозвращает свой первый аргумент, предоставленную ссылку, как значение функции; посколькуblessобычно является последним выполняемым действием в конструкторах, это означает, что ссылка на объект возвращается как значение конструктора, что позволяет вызывающему элементу сразу использовать этот возвращенный объект в вызовах методов.CLASSNAMEвсегда должен быть именем с регистром, поскольку имена с прописными или строчными буквами предназначены только для встроенных типов и пragma Perl соответственно. Избегайте создания имен пакетов со всеми прописными или строчными буквами, чтобы избежать путаницы.Также избегайте благословения вещей в имя класса
0; это приведет к тому, что код (по ошибке) проверяющий результатref, чтобы увидеть, является ли ссылкаblessed, завершится неудачей, так как «0», ложное значение, будет возвращено.См. "Perl Modules" в perlmod для более подробной информации.
-
- break
-
Прервать блок
given.breakдоступен только если функция"switch"feature включена, или если она с префиксомCORE::. Функция"switch"feature включается автоматически с объявлениемuse v5.10(или выше) в текущей области видимости. - caller EXPR
- caller
-
Возвращает контекст текущего вызова подпрограммы чистого Perl. В скалярном контексте, возвращает имя пакета вызывающей стороны, если есть вызывающая сторона (то есть, если мы находимся в подпрограмме или
evalилиrequire), и неопределенное значение в противном случае. caller никогда не возвращает XS-подпрограммы, и они пропускаются. Следующая подпрограмма чистого Perl появится вместо XS-подпрограммы в возвращаемых значениях caller. В списочном контексте, caller возвращает# 0 1 2 my ($package, $filename, $line) = caller;Как
__FILE__и__LINE__, имя файла и номер строки, возвращённые здесь, могут быть изменены механизмом, описанным в "Plain Old Comments (Not!)" в perlsyn.С EXPR, он возвращает дополнительную информацию, используемую отладчиком для печати трассировки стека. Значение EXPR указывает, на сколько кадров вызова вернуться назад перед текущим.
# 0 1 2 3 4 my ($package, $filename, $line, $subroutine, $hasargs, # 5 6 7 8 9 10 $wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash) = caller($i);Здесь, $subroutine — это функция, которую вызвала вызывающая сторона (а не функция, содержащая вызывающую сторону). Обратите внимание, что $subroutine может быть
(eval), если кадр не является вызовом подпрограммы, аeval. В таком случае дополнительные элементы $evaltext и$is_requireустановлены:$is_requireимеет значение true, если кадр создан операторомrequireилиuse, $evaltext содержит текст оператораeval EXPR. В частности, для оператораeval BLOCK, $subroutine равен(eval), но $evaltext не определён. (Обратите также внимание, что каждый операторuseсоздаёт кадрrequireвнутри кадраeval EXPR.) $subroutine также может быть(unknown)если эта конкретная подпрограмма была удалена из таблицы символов.$hasargsимеет значение true, если для кадра был создан новый экземпляр@_.$hintsи$bitmaskсодержат прагматические подсказки, с которыми была скомпилирована вызывающая сторона.$hintsсоответствует$^H, а$bitmaskсоответствует${^WARNING_BITS}. Значения$hintsи$bitmaskмогут изменяться между версиями Perl и не предназначены для внешнего использования.$hinthash— ссылка на хеш, содержащий значение%^Hпри компиляции вызывающей стороны илиundef, если%^Hбыло пустым. Не изменяйте значения этого хеша, так как они являются фактическими значениями, хранящимися в дереве оптимизации.Обратите внимание, что единственные типы кадров вызова, которые видны, это вызовы подпрограмм и
eval. Другие формы контекста, такие как циклыwhileилиforeachили блокиtryне считаются интересными дляcaller, так как они не изменяют поведение выраженияreturn.Кроме того, при вызове из пакета DB в списочном контексте и с аргументом, caller возвращает более подробную информацию: он устанавливает переменную списка
@DB::argsв качестве аргументов, с которыми была вызвана подпрограмма.Обратите внимание, что оптимизатор может оптимизировать кадры вызова до того, как
callerполучит информацию. Это означает, чтоcaller(N)может не вернуть информацию о кадре вызова, который вы ожидаете, из-заN > 1. В частности,@DB::argsможет содержать информацию из предыдущего вызоваcaller.Обратите внимание, что установка
@DB::argsявляется попытки, предназначенная для отладки или создания трассировок стека, и на неё не следует полагаться. В частности, так как@_содержит псевдонимы аргументов вызывающей стороны, Perl не копирует@_, поэтому@DB::argsбудет содержать изменения, которые подпрограмма вносит в@_или его содержимое, а не исходные значения во время вызова.@DB::args, как и@_, не хранит явных ссылок на свои элементы, поэтому в определённых случаях его элементы могут быть освобождены и перераспределены для других переменных или временных значений. Наконец, побочным эффектом текущей реализации является то, что эффектыshift @_обычно можно отменить (но неpop @_или других склеек, и не если ссылка на@_была взята, и с оговоркой о перераспределённых элементах), поэтому@DB::argsфактически является гибридом текущего состояния и начального состояния@_. Будьте осторожны. - chdir EXPR
- chdir FILEHANDLE
- chdir DIRHANDLE
- chdir
-
Изменяет текущую рабочую директорию на EXPR, если возможно. Если EXPR опущен, изменяет директорию, указанную в
$ENV{HOME}, если она установлена; если нет, изменяет директорию, указанную в$ENV{LOGDIR}. (Под VMS, проверяется также переменная$ENV{'SYS$LOGIN'}и используется, если она установлена.) Если ни одна не установлена,chdirничего не делает и терпит неудачу. Возвращает true при успехе, false в противном случае. См. пример подdie.На системах, поддерживающих fchdir(2), вы можете передать дескриптор файла или дескриптор директории в качестве аргумента. На системах, которые не поддерживают fchdir(2), передача дескрипторов вызывает исключение.
- chmod LIST
-
Изменяет разрешения списка файлов. Первый элемент списка должен быть числовым режимом, который, вероятно, должен быть восьмеричным числом, и который определённо не должен быть строкой восьмеричных цифр:
0644допустимо, но"0644"нет. Возвращает количество успешно изменённых файлов. См. такжеoct, если у вас есть только строка.my $cnt = chmod 0755, "foo", "bar"; chmod 0755, @executables; my $mode = "0644"; chmod $mode, "foo"; # !!! sets mode to # --w----r-T my $mode = "0644"; chmod oct($mode), "foo"; # this is better my $mode = 0644; chmod $mode, "foo"; # this is bestНа системах, поддерживающих fchmod(2), вы можете передать дескрипторы файлов среди файлов. На системах, которые не поддерживают fchmod(2), передача дескрипторов вызывает исключение. Дескрипторы файлов должны передаваться в виде глобов или ссылок на глобы, чтобы они распознавались; слова без префиксов считаются именами файлов.
open(my $fh, "<", "foo"); my $perm = (stat $fh)[2] & 07777; chmod($perm | 0600, $fh);Вы также можете импортировать символические
S_I*константы из модуляFcntl:use Fcntl qw( :mode ); chmod S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, @executables; # Identical to the chmod 0755 of the example above.Проблемы переносимости: "chmod" в perlport.
- chomp VARIABLE
- chomp( LIST )
- chomp
-
Эта более безопасная версия
chopудаляет любые завершающие строки, соответствующие текущему значению$/(также известные как$INPUT_RECORD_SEPARATORв модулеEnglish). Возвращает общее количество удалённых символов из всех аргументов. Часто используется для удаления символа новой строки из конца записи ввода, когда вы беспокоитесь, что последняя запись может быть без символа новой строки. В режиме абзацев ($/ = '') удаляет все завершающие символы новой строки из строки. В режиме slurp ($/ = undef) или режиме записей с фиксированной длиной ($/является ссылкой на целое число или подобное; см. perlvar),chompничего не удалит. Если VARIABLE опущен, он удаляет символ новой строки из$_. Пример:while (<>) { chomp; # avoid \n on last field my @array = split(/:/); # ... }Если VARIABLE — хеш, он удаляет символ новой строки из значений хеша, но не из ключей, при этом сбрасывая итератор
each.Вы можете фактически использовать chomp для любого lvalue, включая присвоение:
chomp(my $cwd = `pwd`); chomp(my $answer = <STDIN>);Если вы используете chomp для списка, каждый элемент будет обработан, и будет возвращено общее количество удалённых символов.
Обратите внимание, что скобки необходимы, когда вы используете chomp для чего-либо, кроме простой переменной. Это потому, что
chomp $cwd = `pwd`;интерпретируется как(chomp $cwd) = `pwd`;, а не какchomp( $cwd = `pwd` ), как вы могли ожидать. Аналогично,chomp $a, $bинтерпретируется какchomp($a), $b, а не какchomp($a, $b). - chop VARIABLE
- chop( LIST )
- chop
-
Удаляет последний символ строки и возвращает удалённый символ. Он намного эффективнее, чем
s/.$//s, поскольку не сканирует и не копирует строку. Если VARIABLE опущен, удаляет последний символ из$_. Если VARIABLE — хеш, он удаляет последний символ из значений хеша, но не из ключей, при этом сбрасывая итераторeach.Вы можете фактически использовать chop для любого lvalue, включая присвоение.
Если вы используете chop для списка, каждый элемент будет обработан. Возвращается только значение последнего
chop.Обратите внимание, что
chopвозвращает последний символ. Чтобы вернуть все, кроме последнего символа, используйтеsubstr($string, 0, -1).См. также
chomp. - chown LIST
-
Изменяет владельца (и группу) списка файлов. Первые два элемента списка должны быть числовыми uid и gid в этом порядке. Значение -1 в любой позиции на большинстве систем интерпретируется как сохранение этого значения без изменений. Возвращает количество успешно изменённых файлов.
my $cnt = chown $uid, $gid, 'foo', 'bar'; chown $uid, $gid, @filenames;На системах, поддерживающих fchown(2), вы можете передавать дескрипторы файлов среди файлов. На системах, которые не поддерживают fchown(2), передача дескрипторов вызывает исключение. Дескрипторы файлов должны передаваться в виде глобов или ссылок на глобы, чтобы они распознавались; слова без префиксов считаются именами файлов.
Вот пример поиска нечисловых uid в файле passwd:
print "User: "; chomp(my $user = <STDIN>); print "Files: "; chomp(my $pattern = <STDIN>); my ($login,$pass,$uid,$gid) = getpwnam($user) or die "$user not in passwd file"; my @ary = glob($pattern); # expand filenames chown $uid, $gid, @ary;На большинстве систем вам не разрешается изменять владение файлом, если вы не суперпользователь, хотя вы должны иметь возможность изменить группу на любую из ваших дополнительных групп. На небезопасных системах эти ограничения могут быть ослаблены, но это не является переносимым предположением. На системах POSIX это можно определить следующим образом:
use POSIX qw(sysconf _PC_CHOWN_RESTRICTED); my $can_chown_giveaway = ! sysconf(_PC_CHOWN_RESTRICTED);Проблемы переносимости: "chown" в perlport.
- chr NUMBER
- chr
-
Возвращает символ, представленный данным ЧИСЛОМ в наборе символов. Например,
chr(65)это"A"в ASCII или Unicode, а chr(0x263a) — это смайлик Unicode.Отрицательные значения возвращают заменяющий символ Unicode (chr(0xfffd)), за исключением случаев использования pragmy bytes, где используются младшие восемь битов значения (округлённые до целого числа).
Если ЧИСЛО опущено, используется
$_.Для обратного преобразования используйте
ord.Обратите внимание, что символы с 128 по 255 (включительно) по умолчанию не кодируются как UTF-8 по причинам обратной совместимости.
См. perlunicode для получения дополнительной информации о Unicode.
- chroot FILENAME
- chroot
-
Эта функция работает так же, как системный вызов с тем же именем: она устанавливает указанную директорию в качестве новой корневой директории для всех последующих путей, начинающихся с
/вашим процессом и всеми его дочерними процессами. (Она не изменяет текущую рабочую директорию, которая остаётся неизменной.) По соображениям безопасности, этот вызов ограничен для суперпользователя. Если FILENAME опущено, выполняетсяchrootк$_.ПРИМЕЧАНИЕ: По соображениям безопасности
chdir("/")(chdirв корневую директорию) немедленно послеchroot, в противном случае текущая рабочая директория может оказаться вне новой корневой директории.Проблемы совместимости: "chroot" в perlport.
- class NAMESPACE
- class NAMESPACE VERSION
- class NAMESPACE BLOCK
- class NAMESPACE VERSION BLOCK
-
Объявляет блок или остальную часть единицы компиляции в заданном пространстве имен, которое реализует класс объекта. Это работает аналогично
package, за исключением того, что созданный пакет ведёт себя как класс. - close FILEHANDLE
- close
-
Закрывает файл или канал, связанный с файловым дескриптором, сбрасывает буферы ввода-вывода и закрывает системный дескриптор файла. Возвращает true, если эти операции выполнены успешно и никакой слой PerlIO не сообщил об ошибке. Закрывает текущий выбранный файловый дескриптор, если аргумент опущен.
Вам не нужно закрывать FILEHANDLE, если вы сразу же собираетесь выполнить другую
openна нём, так какopenзакрывает его за вас. (См.open.) Однако явноеcloseвходного файла сбрасывает счётчик строк ($.), в то время как неявное закрытие, выполняемоеopen, этого не делает.Если файловый дескриптор получен из открытого канала,
closeвозвращает false, если один из других системных вызовов завершился неудачей или если его программа завершилась с ненулевым статусом. Если единственной проблемой было то, что программа завершилась с ненулевым статусом,$!будет установлено в0. Закрытие канала также ждёт завершения процесса, выполняющего операцию на канале — в случае, если вы хотите посмотреть на вывод канала позже — и неявно помещает значение кода завершения этой команды в$?и${^CHILD_ERROR_NATIVE}.Если работают несколько потоков,
closeна файловом дескрипторе из открытого канала возвращает true без ожидания завершения дочернего процесса, если файловый дескриптор всё ещё открыт в другом потоке.Закрытие входного конца канала до завершения записи процесса, выполняющего запись на другом конце, приводит к получению писателем сигнала SIGPIPE. Если другой конец не может обработать это, убедитесь, что вы прочитали все данные перед закрытием канала.
Пример:
open(OUTPUT, '|sort >foo') # pipe to sort or die "Can't start sort: $!"; #... # print stuff to output close OUTPUT # wait for sort to finish or warn $! ? "Error closing sort pipe: $!" : "Exit status $? from sort"; open(INPUT, 'foo') # get sort's results or die "Can't open 'foo' for input: $!";FILEHANDLE может быть выражением, значение которого может быть использовано как косвенный файловый дескриптор, обычно имя реального файлового дескриптора или автоматически создаваемый дескриптор.
- closedir DIRHANDLE
-
Закрывает директорию, открытую с помощью
opendir, и возвращает результат выполнения этого системного вызова. - connect SOCKET,NAME
-
Пытается подключиться к удалённому сокету, как и connect(2). Возвращает true, если подключение прошло успешно, false — в противном случае. NAME должен быть упакованным адресом соответствующего типа для сокета. См. примеры в "Sockets: Client/Server Communication" в perlipc.
- continue BLOCK
- continue
-
Когда после него следует блок,
continueна самом деле является оператором управления потоком, а не функцией. Если существуетcontinueблок, прикреплённый к блоку (обычно в циклеwhileилиforeach), он всегда выполняется непосредственно перед тем, как условное выражение будет снова оценено, точно так же, как третья часть циклаforв C. Таким образом, он может использоваться для инкремента переменной цикла даже тогда, когда цикл был продолжен с помощьюnext(что аналогично операторуcontinueв C).last,nextилиredoмогут появляться внутри блокаcontinue;lastиredoведут себя так, как будто они были выполнены внутри основного блока. То же самое относится кnext, но поскольку он выполнит блокcontinue, это может быть более интересным.while (EXPR) { ### redo always comes here do_something; } continue { ### next always comes here do_something_else; # then back the top to re-check EXPR } ### last always comes hereОпущение раздела
continueэквивалентно использованию пустого, что вполне логично, поэтомуnextвозвращается непосредственно для проверки условия в верхней части цикла.Когда нет блока,
continue— это функция, которая переходит к следующей части текущего блокаwhenилиdefaultвместо того, чтобы итерировать динамически включающий блокforeachили выходить из лексически включающего блокаgiven. В Perl 5.14 и более ранних версиях эта формаcontinueбыла доступна только при включённой функции"switch". См. feature и "Switch Statements" в perlsyn для получения дополнительной информации. - cos EXPR
- cos
-
Возвращает косинус EXPR (в радианах). Если EXPR опущено, берётся косинус от
$_.Для обратной косинусной операции можно использовать функцию
Math::Trig::acosили использовать это соотношение:sub acos { atan2( sqrt(1 - $_[0] * $_[0]), $_[0] ) } - crypt PLAINTEXT,SALT
-
Создаёт строку дайджеста точно так же, как функция crypt(3) в библиотеке C (если у вас есть версия, которая не была удалена как потенциальная угроза).
crypt— это одностороннее хеширование. PLAINTEXT и SALT преобразуются в короткую строку, называемую дайджестом, который возвращается. Один и тот же PLAINTEXT и SALT всегда будут возвращать одну и ту же строку, но нет (известного) способа получить исходный PLAINTEXT из хеша. Незначительные изменения в PLAINTEXT или SALT приведут к значительным изменениям в дайджесте.Функции расшифровки нет. Эта функция не очень полезна для криптографии (для этого ищите модули Crypt на вашем ближайшем зеркале CPAN), и название «crypt» немного неудачное. Вместо этого она в первую очередь используется для проверки, одинаковы ли два фрагмента текста, без необходимости передавать или хранить сам текст. Примером является проверка правильности введённого пароля. Хранится дайджест пароля, а не сам пароль. Пользователь вводит пароль, который
cryptс тем же солью, что и хранящийся дайджест. Если два дайджеста совпадают, пароль правильный.При проверке существующей строки дайджеста вы должны использовать дайджест в качестве соли (как
crypt($plain, $digest) eq $digest). Используемая для создания дайджеста соль отображается как часть дайджеста. Это гарантирует, чтоcryptбудет хешировать новую строку с той же солью, что и дайджест. Это позволяет вашему коду работать со стандартной функциейcryptи с более экзотическими реализациями. Другими словами, не делайте предположений о возвращаемой строке или о том, сколько байтов соли может иметь значение.Традиционно результат представляет собой строку из 13 байтов: два первых байта соли, за которыми следуют 11 байтов из набора
[./0-9A-Za-z], и только первые восемь байтов PLAINTEXT имели значение. Но альтернативные схемы хеширования (например, MD5), схемы повышения уровня безопасности (например, C2) и реализации на платформах, не являющихся Unix, могут создавать разные строки.При выборе новой соли создайте случайную строку из двух символов, символы которых берутся из набора
[./0-9A-Za-z](например,join '', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64]). Этот набор символов является лишь рекомендацией; допустимые символы в соли зависят исключительно от библиотеки crypt вашей системы, и Perl не может ограничивать, какие солиcryptпринимает.Вот пример, гарантирующий, что тот, кто запускает эту программу, знает свой пароль:
my $pwd = (getpwuid($<))[1]; system "stty -echo"; print "Password: "; chomp(my $word = <STDIN>); print "\n"; system "stty echo"; if (crypt($word, $pwd) ne $pwd) { die "Sorry...\n"; } else { print "ok\n"; }Конечно, вводить свой пароль тому, кто его спрашивает, неразумно.
Функция
cryptне подходит для хеширования больших объёмов данных, не в последнюю очередь потому, что вы не можете получить обратно информацию. Обратите внимание на модуль Digest для более надёжных алгоритмов.Если использовать
cryptсо строкой Unicode (которая потенциально содержит символы с кодовыми точками выше 255), Perl пытается понять ситуацию, попытавшись понизить (копию) строки до восьмибитной строки байтов перед вызовомcrypt(на этой копии). Если это работает, хорошо. Если нет,cryptзавершается сWide character in crypt.Проблемы совместимости: "crypt" в perlport.
- dbmclose HASH
-
[Данная функция в значительной степени устарела и заменена функцией
untie.]Разрывает привязку между файлом DBM и хешем.
Проблемы с переносимостью: "dbmclose" в perlport.
- dbmopen HASH,DBNAME,MASK
-
[Данная функция в значительной степени устарела и заменена функцией
tie.]Эта функция связывает файл dbm(3), ndbm(3), sdbm(3), gdbm(3) или Berkeley DB с хешем. HASH — имя хеша. (В отличие от обычной функции
open, первый аргумент — не дескриптор файла, хотя и выглядит так). DBNAME — имя базы данных (без расширений .dir или .pag, если таковые имеются). Если база данных не существует, она создаётся с защитой, указанной в MASK (как модифицировано функциейumask). Чтобы предотвратить создание базы данных, если она не существует, вы можете указать MASK равным 0, и функция вернёт ложное значение, если не найдёт существующей базы данных. Если ваша система поддерживает только старые функции DBM, вы можете сделать только один вызовdbmopenв вашей программе. В старых версиях Perl, если ваша система не имела ни DBM, ни ndbm, вызовdbmopenприводил к ошибке; сейчас он переключается на sdbm(3).Если у вас нет права записи в файл DBM, вы можете только читать переменные хеша, но не устанавливать их. Если вы хотите проверить, есть ли право на запись, используйте тесты файлов или попробуйте установить фиктивную запись в хеше внутри
evalдля перехвата ошибки.Обратите внимание, что функции, такие как
keysиvalues, могут возвращать огромные списки при использовании с большими файлами DBM. Вы можете предпочесть использовать функциюeachдля итерации по большим файлам DBM. Пример:# print out history file offsets dbmopen(%HIST,'/usr/lib/news/history',0666); while (($key,$val) = each %HIST) { print $key, ' = ', unpack('L',$val), "\n"; } dbmclose(%HIST);См. также AnyDBM_File для более подробного описания преимуществ и недостатков различных подходов к dbm, а также DB_File для особенно богатой реализации.
Вы можете контролировать, какую библиотеку DBM использовать, загрузив её перед вызовом
dbmopen:use DB_File; dbmopen(%NS_Hist, "$ENV{HOME}/.netscape/history.db") or die "Can't open netscape history file: $!";Проблемы с переносимостью: "dbmopen" в perlport.
- defined EXPR
- defined
-
Возвращает булево значение, показывающее, имеет ли EXPR значение, отличное от неопределённого значения
undef. Если EXPR отсутствует, проверяется$_.Многие операции возвращают
undefдля указания ошибки, конца файла, системной ошибки, неинициализированной переменной и других исключительных условий. Эта функция позволяет различатьundefот других значений. (Простое булево сравнение не позволит различатьundef, ноль, пустую строку и"0", которые все одинаково ложны.) Обратите внимание, что, посколькуundef— это допустимый скаляр, его присутствие не обязательно указывает на исключительное условие:popвозвращаетundef, когда его аргумент — пустой массив, или когда элемент для возврата оказываетсяundef.Вы также можете использовать
defined(&func)для проверки, была ли когда-либо определена подпрограммаfunc. Возвращаемое значение не зависит от каких-либо предварительных объявленийfunc. Подпрограмма, которая не определена, всё же может быть вызываемой: её пакет может иметь методAUTOLOAD, который делает её доступной при первом вызове; см. perlsub.Использование
definedс агрегатами (хешами и массивами) больше не поддерживается. Раньше оно сообщало, была ли когда-либо выделена память для данного агрегата. Вместо этого следует использовать простое тестирование размера:if (@an_array) { print "has array elements\n" } if (%a_hash) { print "has hash members\n" }При использовании с элементом хеша, оно сообщает, определено ли значение, а не существует ли ключ в хеше. Для последней цели используйте
exists.Примеры:
print if defined $switch{D}; print "$val\n" while defined($val = pop(@ary)); die "Can't readlink $sym: $!" unless defined($value = readlink $sym); sub foo { defined &$bar ? $bar->(@_) : die "No bar"; } $debugging = 0 unless defined $debugging;Примечание: Многие люди склонны чрезмерно использовать
definedи затем удивляются, обнаружив, что число0и""(строка нулевой длины) являются, по факту, определёнными значениями. Например, если вы говорите"ab" =~ /a(.*)b/;Совпадение шаблона происходит, и
$1определено, хотя оно соответствовало "ничему". На самом деле это не означает, что совпадение ни с чем не произошло. Скорее, оно соответствовало чему-то, что оказалось нулевой длины. Всё это вполне законно и честно. Когда функция возвращает неопределённое значение, это означает, что она не смогла дать честный ответ. Поэтому вы должны использоватьdefinedтолько когда сомневаетесь в целостности того, что вы пытаетесь сделать. В других случаях, простое сравнение с0или""— то, что вам нужно. - delete EXPR
-
Принимая выражение, которое определяет элемент или срез хеша,
deleteудаляет указанные элементы из этого хеша, так чтоexistsдля этого элемента больше не возвращает истинное значение. Установка элемента хеша в неопределённое значение не удаляет его ключ, но удаление его делает; см.exists.В списке контексте, обычно возвращает удалённое(ые) значение(я) или последний такой элемент в скалярном контексте. Длина возвращаемого списка соответствует длине списка аргументов: удаление несуществующих элементов возвращает неопределённое значение в соответствующих позициях. Начиная с Perl 5.28, в
deleteможет передаваться срез хеша «ключ/значение», и возвращаемое значение — список пар «ключ/значение» (два элемента для каждого удалённого элемента хеша).deleteтакже может использоваться с массивами и массивами срезов, но его поведение менее очевидно. Хотяexistsвернёт ложь для удалённых записей, удаление элементов массива никогда не изменяет индексов существующих значений; используйтеshiftилиspliceдля этого. Однако, если какие-либо удалённые элементы находятся в конце массива, размер массива уменьшается до позиции самого высокого элемента, который ещё возвращает истинное значение дляexists, или до 0, если таковых нет. Другими словами, массив не будет иметь хвостовых несуществующих элементов после удаления.ПРЕДУПРЕЖДЕНИЕ: Вызов
deleteсо значениями массива настоятельно не рекомендуется. Понятие удаления или проверки существования элементов массива Perl не является концептуально последовательным и может привести к неожиданному поведению.Удаление из
%ENVизменяет среду. Удаление из хеша, привязанного к файлу DBM, удаляет запись из файла DBM. Удаление из хеша или массива,tied, может не вернуть ничего; это зависит от реализации метода DELETE пакетаtied, который может делать что угодно.Конструкции
delete local EXPRлокализуют удаление во время выполнения для текущего блока. До тех пор, пока блок не завершится, локально удалённые элементы временно больше не существуют. См. "Локализованное удаление элементов составных типов" в perlsub.my %hash = (foo => 11, bar => 22, baz => 33); my $scalar = delete $hash{foo}; # $scalar is 11 $scalar = delete @hash{qw(foo bar)}; # $scalar is 22 my @array = delete @hash{qw(foo baz)}; # @array is (undef,33)Следующее (неэффективно) удаляет все значения %HASH и @ARRAY:
foreach my $key (keys %HASH) { delete $HASH{$key}; } foreach my $index (0 .. $#ARRAY) { delete $ARRAY[$index]; }И эти тоже:
delete @HASH{keys %HASH}; delete @ARRAY[0 .. $#ARRAY];Но оба медленнее, чем присвоение пустого списка или удаления %HASH или @ARRAY, что является обычным способом очистки агрегата:
%HASH = (); # completely empty %HASH undef %HASH; # forget %HASH ever existed @ARRAY = (); # completely empty @ARRAY undef @ARRAY; # forget @ARRAY ever existedВыражение EXPR может быть произвольно сложным, при условии, что его последняя операция — элемент или срез агрегата:
delete $ref->[$x][$y]{$key}; delete $ref->[$x][$y]->@{$key1, $key2, @morekeys}; delete $ref->[$x][$y][$index]; delete $ref->[$x][$y]->@[$index1, $index2, @moreindices]; - die LIST
-
dieвызывает исключение. Внутриevalисключение помещается в$@, аevalзавершается с неопределённым значением. Если исключение находится вне всех окружающихeval, то неперехваченное исключение выводится вSTDERRи Perl завершается с кодом выхода, указывающим на ошибку. Если нужно завершить процесс со специфическим кодом выхода, см.exit.Примеры:
die "Can't cd to spool: $!\n" unless chdir '/usr/spool/news'; chdir '/usr/spool/news' or die "Can't cd to spool: $!\n"Большую часть времени
dieвызывается со строкой, используемой в качестве исключения. Вы можете указать либо один операнд без ссылки, который будет служить исключением, либо список из двух или более элементов, которые будут приведены к строковому виду и конкатенированы для создания исключения.Если строковое исключение не заканчивается переводом строки, к нему добавляются номер текущей строки скрипта, номер строки входных данных (если таковые имеются) и перевод строки. Обратите внимание, что "номер строки входных данных" (также известный как "блок") подчиняется тому, что в данный момент определено как "строка", и также доступен как специальная переменная
$.. См. "$/" в perlvar и "$." в perlvar.Подсказка: иногда добавление
", stopped"к вашему сообщению сделает его более понятным, когда к строке"at foo line 123"добавляется это. Предположим, вы запускаете скрипт "canasta".die "/etc/games is no good"; die "/etc/games is no good, stopped";что даёт, соответственно
/etc/games is no good at canasta line 123. /etc/games is no good, stopped at canasta line 123.Если список был пустым или преобразован в пустую строку, и
$@уже содержит значение исключения (обычно из предыдущегоeval), то это значение используется повторно после добавления"\t...propagated". Это полезно для передачи исключений:eval { ... }; die unless $@ =~ /Expected exception/;Если список был пустым или преобразован в пустую строку, и
$@содержит ссылку на объект, имеющий методPROPAGATE, этот метод будет вызван с дополнительными параметрами файла и номера строки. Возвращаемое значение заменяет значение в$@; т.е., как если бы был вызван$@ = eval { $@->PROPAGATE(__FILE__, __LINE__) };.Если список был пустым или преобразован в пустую строку, и
$@также пусто, то используется строка"Died".Вы также можете вызвать
dieс аргументом-ссылкой, и если это перехвачено вeval,$@содержит эту ссылку. Это позволяет более сложную обработку исключений с использованием объектов, которые сохраняют произвольную информацию об исключении. Такая схема иногда предпочтительнее, чем сопоставление конкретных строковых значений$@с регулярными выражениями.Поскольку Perl приводит к строковому виду сообщения о неперехваченном исключении перед отображением, вам, вероятно, захочется перегрузить операции строкового преобразования для объектов исключения. См. overload для получения подробностей об этом. Сообщение в строковом виде должно быть непустым и заканчиваться переводом строки, чтобы соответствовать обработке строковых исключений. Кроме того, поскольку ссылка на объект исключения не может быть приведена к строковому виду без его уничтожения, Perl не пытается добавить информацию о расположении или другую информацию к ссылке на исключение. Если вам нужна информация о расположении с объектом сложного исключения, вам нужно будет самостоятельно поместить эту информацию в объект.
Поскольку
$@— глобальная переменная, будьте осторожны, чтобы анализ исключения, перехваченногоeval, не заменял ссылку в глобальной переменной. Легче всего сделать локальную копию ссылки перед любыми манипуляциями. Вот пример:use Scalar::Util "blessed"; eval { ... ; die Some::Module::Exception->new( FOO => "bar" ) }; if (my $ev_err = $@) { if (blessed($ev_err) && $ev_err->isa("Some::Module::Exception")) { # handle Some::Module::Exception } else { # handle all other possible exceptions } }Если неперехваченное исключение приводит к завершению интерпретатора, код выхода определяется из значений
$!и$?с помощью этого псевдокода:exit $! if $!; # errno exit $? >> 8 if $? >> 8; # child exit status exit 255; # last resortКак и с
exit,$?устанавливается перед разворачиванием стека вызовов; любыеDESTROYилиENDобработчики затем могут изменить это значение, а следовательно, и код выхода Perl.Целью является извлечение как можно большей информации о вероятной причине в ограниченном пространстве системного кода выхода. Однако, поскольку
$!является значением C'serrno, которое может быть установлено любым системным вызовом, это означает, что значение кода выхода, используемогоdie, может быть непредсказуемым, поэтому на нём нельзя полагаться, кроме как на том, что он не равен нулю.Вы можете организовать вызов обратного вызова непосредственно перед тем, как
dieвыполнит своё действие, установив обработчик$SIG{__DIE__}. Связанный обработчик вызывается со значением исключения в качестве аргумента и может изменить исключение, если сочтёт это уместным, вызвавdieснова. См. "%SIG" в perlvar для получения подробной информации об установке элементов%SIGиevalдля примеров. Хотя эта функция должна запускаться только непосредственно перед завершением программы, сейчас этого нет: обработчик$SIG{__DIE__}сейчас вызывается даже внутри блоков/строк, обрамлённыхeval! Если нужно, чтобы обработчик ничего не делал в таких ситуациях, поместитеdie @_ if $^S;как первую строку обработчика (см. "$^S" в perlvar). Поскольку это способствует странному действию на расстоянии, это неинтуитивное поведение может быть исправлено в будущей версии.
- do BLOCK
-
Не совсем функция. Возвращает значение последней команды в последовательности команд, указанной в BLOCK. При использовании модификатора цикла
whileилиuntilвыполняет BLOCK один раз перед проверкой условия цикла. (При других операторах модификаторы цикла проверяют условие сначала.)do BLOCKне считается циклом, поэтому операторы управления цикломnext,lastилиredoне могут быть использованы для выхода из блока или перезапуска.См. perlsyn для альтернативных стратегий.
- do EXPR
-
Использует значение EXPR в качестве имени файла и выполняет содержимое файла как скрипт Perl:
# load the exact specified file (./ and ../ special-cased) do '/foo/stat.pl'; do './stat.pl'; do '../foo/stat.pl'; # search for the named file within @INC do 'stat.pl'; do 'foo/stat.pl';do './stat.pl'по большей части подобноeval `cat stat.pl`;за исключением большей краткости, отсутствия запуска внешних процессов и отслеживания текущего имени файла для сообщений об ошибках. Также отличается тем, что код, оценённый с помощью
do FILE, не видит лексических переменных во внешней области видимости;eval STRINGвидит. Тем не менее, сходство в том, что он перекомпилирует файл каждый раз при вызове, поэтому вы, вероятно, не захотите использовать это внутри цикла.Использование
doс относительным путём (кроме ./ и ../), напримерdo 'foo/stat.pl';будет искать в каталогах
@INCи обновлять%INC, если файл найден. См. "@INC" в perlvar и "%INC" в perlvar для этих переменных. В частности, обратите внимание, что исторически@INCсодержал '.' (текущий каталог), что делало эти два случая эквивалентными, но это больше не обязательно в версиях Perl 5.26.0 и выше, так как '.' по умолчанию не включается в@INCв версиях perl 5.26.0 и выше. Вместо этого Perl выведет предупреждение:do "stat.pl" failed, '.' is no longer in @INC; did you mean do "./stat.pl"?Если
doможет прочитать файл, но не может его скомпилировать, он возвращаетundefи устанавливает сообщение об ошибке в$@. Еслиdoне может прочитать файл, он возвращает undef и устанавливает$!в ошибку. Всегда сначала проверяйте$@, так как компиляция может завершиться неудачей, также установив$!. Если файл успешно скомпилирован,doвозвращает значение последнего вычисленного выражения.Включение модулей библиотек лучше выполнять с помощью операторов
useиrequire, которые также выполняют автоматическую проверку ошибок и генерируют исключение при возникновении проблемы.Возможно, вы захотите использовать
doдля чтения файла конфигурации программы. Ручная проверка ошибок может быть выполнена таким образом:# Read in config files: system first, then user. # Beware of using relative pathnames here. for $file ("/share/prog/defaults.rc", "$ENV{HOME}/.someprogrc") { unless ($return = do $file) { warn "couldn't parse $file: $@" if $@; warn "couldn't do $file: $!" unless defined $return; warn "couldn't run $file" unless $return; } } - dump LABEL
- dump EXPR
- dump
-
Эта функция вызывает немедленную дамп-память. См. также командную строку -u в perlrun, которая делает то же самое. В основном это позволяет использовать программу undump (не входит в поставку), чтобы преобразовать дамп памяти в исполняемый бинарный файл после инициализации всех ваших переменных в начале программы. При выполнении нового бинарного файла он начнёт выполнение с
goto LABEL(со всеми ограничениями, с которыми сталкиваетсяgoto). Представьте его как goto с промежуточной дампом памяти и реинкарнацией. ЕслиLABELопущено, перезапускает программу с начала. Формаdump EXPR, доступная начиная с Perl 5.18.0, позволяет вычислять имя во время выполнения, в остальном она идентичнаdump LABEL.ПРЕДУПРЕЖДЕНИЕ: Любые файлы, открытые на момент дампа, не будут открыты повторно, когда программа будет реинкарнирована, что может привести к путанице в Perl.
Эта функция теперь в значительной степени устарела, в основном потому, что очень сложно преобразовать файл дампа памяти в исполняемый файл. С версии Perl 5.30 она должна вызываться как
CORE::dump().В отличие от большинства именованных операторов, она имеет тот же приоритет, что и присваивание. Она также освобождена от правила «выглядит как функция», поэтому
dump ("foo")."bar"приведет к тому, что «bar» станет частью аргументаdump.Проблемы совместимости: "dump" в perlport.
- each HASH
- each ARRAY
-
При вызове на хеш в контексте списка возвращает список из 2 элементов: ключа и значения для следующего элемента хеша. В Perl 5.12 и более поздних версиях также возвращает индекс и значение для следующего элемента массива, так что вы можете перебирать его; более старые версии Perl рассматривают это как синтаксическую ошибку. При вызове в скалярном контексте возвращает только ключ (а не значение) в хеше или индекс в массиве.
Элементы хеша возвращаются в, по-видимому, случайном порядке. Фактический случайный порядок специфичен для данного хеша; то же самое множество операций над двумя хешами может привести к разному порядку для каждого хеша. Любая вставка в хеш может изменить порядок, как и любое удаление, за исключением того, что последний ключ, возвращенный функцией
eachилиkeys, может быть удален без изменения порядка. Пока данный хеш не изменён, вы можете полагаться наkeys,valuesиeachдля последовательного возвращения одного и того же порядка. Подробности о том, почему порядок хеша случайный, см. в разделе «Атаки с использованием вычислительной сложности» в perlsec.После того, как
eachвернул все записи из хеша или массива, следующий вызовeachвозвращает пустой список в контексте списка иundefв скалярном контексте; следующий вызов после этого перезапускает итерацию. Каждый хеш или массив имеет свой внутренний итератор, доступный черезeach,keysиvalues. Итератор неявно сбрасывается, когдаeachдостиг конца, как описано выше; его можно явно сбросить, вызвавkeysилиvaluesдля хеша или массива, или сделав ссылку на хеш (но не массив) в контексте списка. Если вы добавляете или удаляете элементы хеша во время итерации по нему, влияние на итератор не определено; например, записи могут быть пропущены или дублированы — поэтому этого не следует делать. Исключение: всегда безопасно удалять элемент, последний возвращённыйeach, поэтому следующий код работает корректно:while (my ($key, $value) = each %hash) { print $key, "\n"; delete $hash{$key}; # This is safe }Связанные хеши могут иметь другое поведение упорядочения по сравнению с реализацией хешей Perl.
Итератор, используемый функцией
each, прикреплён к хешу или массиву и используется совместно всеми операциями итерации, применяемыми к одному и тому же хешу или массиву. Таким образом, все использованияeachдля одного хеша или массива продвигают одну и ту же позицию итератора. Все использованияeachтакже подвержены сбросу итератора любым использованиемkeysилиvaluesдля того же хеша или массива, или при ссылке на хеш (но не на массив) в контексте списка. Это делает циклы, основанные наeach, довольно хрупкими: легко получить такой цикл, в котором итератор уже находится где-то в середине объекта, или случайно испортить состояние итератора во время выполнения тела цикла. Достаточно легко явно сбросить итератор перед началом цикла, но нет способа изолировать состояние итератора, используемого циклом, от состояния итератора, используемого чем-либо другим, что может выполняться внутри тела цикла. Чтобы избежать этих проблем, используйте циклforeach, а не циклwhile-each.Это распространяется на использование
eachна результате анонимного конструктора хеша или массива. Каждый раз создается новый базовый массив или хеш, поэтому каждый раз итерация всегда начинается заново, например:# loops forever while (my ($key, $value) = each @{ +{ a => 1 } }) { print "$key=$value\n"; }Это выводит вашу среду, как и программа printenv(1), но в другом порядке:
while (my ($key,$value) = each %ENV) { print "$key=$value\n"; }Начиная с Perl 5.14, экспериментальная функция позволяла функции
eachпринимать скалярное выражение. Этот эксперимент признан неудачным и был удалён в Perl 5.24.Начиная с Perl 5.18, вы можете использовать голый
eachв циклеwhile, который установит$_на каждой итерации. Если используется либо выражениеeach, либо явное присваивание выраженияeachскаляру в качестве условияwhile/for, то условие фактически проверяет определённость значения выражения, а не его обычное истинностное значение.while (each %ENV) { print "$_=$ENV{$_}\n"; }Чтобы избежать путаницы для пользователей вашего кода, работающих с более ранними версиями Perl, с непонятными синтаксическими ошибками, поместите этот фрагмент в начало вашего файла, чтобы указать, что ваш код будет работать только в Perl последних версий:
use v5.12; # so keys/values/each work on arrays use v5.18; # so each assigns to $_ in a lone while test - eof FILEHANDLE
- eof ()
- eof
-
Возвращает 1, если следующий вызов чтения для FILEHANDLE вернёт конец файла или если FILEHANDLE не открыт. FILEHANDLE может быть выражением, значение которого даёт настоящий дескриптор файла. (Обратите внимание, что эта функция фактически читает символ и затем
ungetcего, поэтому она не полезна в интерактивном контексте.) Не читайте из файла терминала (или не вызывайтеeof(FILEHANDLE)на нём) после достижения конца файла. Тип файлов, таких как терминалы, могут потерять условие конца файла, если вы это сделаете.Функция
eofбез аргумента использует последний прочитанный файл. Использованиеeof()с пустыми скобками отличается. Она относится к псевдофайлу, сформированному из файлов, перечисленных в командной строке и доступных через оператор<>. Так как<>не открывается явно, как обычный дескриптор файла, функцияeof()перед<>приведет к проверке@ARGVдля определения наличия входных данных. Аналогично, функцияeof()после того, как<>вернула конец файла, предположит, что вы обрабатываете другой список@ARGV, и если вы не установили@ARGV, будет читать данные изSTDIN; см. раздел «Операторы ввода-вывода» в perlop.В цикле
while (<>), функциюeofилиeof(ARGV)можно использовать для обнаружения конца каждого файла, тогда какeof()будет обнаруживать конец только последнего файла. Примеры:# reset line numbering on each input file while (<>) { next if /^\s*#/; # skip comments print "$.\t$_"; } continue { close ARGV if eof; # Not eof()! } # insert dashes just before last line of last file while (<>) { if (eof()) { # check for end of last file print "--------------\n"; } print; last if eof(); # needed if we're reading from a terminal }Практический совет: вам почти никогда не нужно использовать
eofв Perl, потому что операторы ввода-вывода обычно возвращаютundef, когда они заканчиваются данными или встречают ошибку. - eval EXPR
- eval BLOCK
- eval
-
evalво всех его формах используется для выполнения небольшой программы Perl, перехватывая любые возникшие ошибки, чтобы не привести к аварийному завершению вызывающей программы.Простой
evalбез аргумента — это простоeval EXPR, где предполагается, что выражение содержится в$_. Таким образом, существует всего две реальныеevalформы; та, что с EXPR, часто называется «строковым eval». В строковом eval значение выражения (которое само определяется в скалярном контексте) сначала анализируется, и если ошибок нет, выполняется как блок в лексическом контексте текущей программы Perl. Эта форма обычно используется для отсрочки анализа и последующего выполнения текста EXPR до времени выполнения. Обратите внимание, что значение анализируется каждый раз, когдаevalвыполняется.Другая форма называется «блочным eval». Она менее универсальна, чем строковый eval, но код внутри BLOCK анализируется только один раз (в то же время, когда анализировался код, окружающий сам
eval), и выполняется в контексте текущей программы Perl. Эта форма обычно используется для более эффективного перехвата исключений, чем первая, а также обеспечивает преимущество проверки кода внутри BLOCK во время компиляции. BLOCK анализируется и компилируется только один раз. Поскольку ошибки перехватываются, его часто используют для проверки доступности заданного функционала.В обеих формах возвращаемое значение — это значение последнего вычисленного выражения внутри мини-программы; также можно использовать оператор возврата, как и с подпрограммами. Выражение, предоставляющее возвращаемое значение, вычисляется в пустом, скалярном или списочном контексте в зависимости от контекста самого
eval. См.wantarrayдля получения дополнительной информации о том, как определить контекст вычисления.Если произошла синтаксическая ошибка, ошибка во время выполнения или был выполнен оператор
die,evalвозвращаетundefв скалярном контексте или пустой список в списочном контексте, и$@устанавливается в сообщение об ошибке. (До версии 5.16 существовала ошибка, из-за которойundefвозвращался в списочном контексте для синтаксических ошибок, но не для ошибок во время выполнения.) Если ошибок не было,$@устанавливается в пустую строку. Оператор управления потоком, такой какlastилиgoto, может обойти установку$@. Имейте в виду, что использованиеevalне подавляет предупреждения Perl в STDERR, и не помещает текст сообщений о предупреждениях в$@. Для этого вам нужно использовать механизм$SIG{__WARN__}или отключить предупреждения внутри блока BLOCK или EXPR, используяno warnings 'all'. См.warn, perlvar и warnings.Обратите внимание, что, поскольку
evalперехватывает иначе фатальные ошибки, это полезно для определения, реализован ли конкретный функционал (например,socketилиsymlink). Это также механизм перехвата исключений Perl, где операторdieиспользуется для повышения исключений.До Perl 5.14 присвоение
$@происходило до восстановления локализованных переменных, что означает, что для работы вашего кода на более старых версиях требуется временная переменная, если вы хотите замаскировать некоторые, но не все ошибки:# alter $@ on nefarious repugnancy only { my $e; { local $@; # protect existing $@ eval { test_repugnancy() }; # $@ =~ /nefarious/ and die $@; # Perl 5.14 and higher only $@ =~ /nefarious/ and $e = $@; } die $e if defined $e }Для каждой формы существуют некоторые различия в рассмотрении:
- Строковый eval
-
Поскольку возвращаемое значение EXPR выполняется как блок в лексическом контексте текущей программы Perl, все внешние лексические переменные видны в нём, а любые настройки переменных пакетов или определения подпрограмм и форматов остаются после этого.
Обратите внимание, что когда
BEGIN {}блоки встроены внутрь блока eval, содержимое блока будет выполнено немедленно и до выполнения остального кода eval. Вы можете полностью отключить это, выполнивlocal ${^MAX_NESTED_EVAL_BEGIN_BLOCKS} = 0; eval $string;что приведет к тому, что любые встроенные
BEGINблоки в$stringвызовут исключение.-
Под функцией
"unicode_eval" -
Если эта функция включена (что является значением по умолчанию при объявлении
use 5.16или выше), Perl предполагает, что EXPR — это строка символов. Любыеuse utf8илиno utf8объявления внутри строки не имеют никакого эффекта. Фильтры исходного кода также запрещены. (unicode_strings, однако, может встречаться внутри строки.)См. также оператор
evalbytes, который правильно работает с фильтрами исходного кода. -
Вне функции
"unicode_eval" -
В этом случае поведение проблематично и не так легко описать. Вот две ошибки, которые сложно исправить без нарушения существующих программ:
-
Внутреннее хранение EXPR в Perl влияет на поведение выполняемого кода. Например:
my $v = eval "use utf8; '$expr'";Если $expr — это
"\xc4\x80"(U+0100 в UTF-8), то значение, хранящееся в$vбудет зависеть от того, хранит ли Perl $expr «улучшенным» (см. utf8) или нет:-
Если улучшенным,
$vбудет"\xc4\x80"(т. е.,use utf8не имеет эффекта.) -
Если не улучшенным,
$vбудет"\x{100}".
Это нежелательно, так как улучшение или нет не должно влиять на поведение строки.
-
-
Активные в
evalфильтрации исходного кода вытекают в текущий компилируемый область действия файла. Чтобы привести пример с модулем CPAN Semi::Semicolons:BEGIN { eval "use Semi::Semicolons; # not filtered" } # filtered here!evalbytesисправляет это, чтобы работать так, как ожидается:use feature "evalbytes"; BEGIN { evalbytes "use Semi::Semicolons; # filtered" } # not filtered
-
Проблемы могут возникнуть, если строка расширяет скаляр, содержащий число с плавающей точкой. Этот скаляр может расширяться до букв, таких как
"NaN"или"Infinity"; или в рамкахuse localeзнак десятичной точки может быть другим, чем точка (например, запятая). Ничто из этого вряд ли будет анализироваться так, как вы ожидаете.Вы должны быть особенно осторожны, когда рассматриваете:
eval $x; # CASE 1 eval "$x"; # CASE 2 eval '$x'; # CASE 3 eval { $x }; # CASE 4 eval "\$$x++"; # CASE 5 $$x++; # CASE 6Случаи 1 и 2 ведут себя идентично: они выполняют код, содержащийся в переменной $x. (Хотя случай 2 имеет вводящие в заблуждение двойные кавычки, заставляющие читателя гадать, что еще может происходить (ничего нет).) Случаи 3 и 4 также ведут себя одинаково: они выполняют код
'$x', который ничего не делает, кроме как возвращает значение $x. (Случай 4 предпочтительнее по чисто визуальным причинам, но у него также есть преимущество — компиляция во время компиляции вместо времени выполнения.) Случай 5 — это место, где обычно вы хотели бы использовать двойные кавычки, за исключением того, что в этой конкретной ситуации вы можете просто использовать символические ссылки, как в случае 6.eval '', выполненный внутри подпрограммы, определенной вDBпакете, не видит обычного окружающего лексического пространства, а скорее пространство первой части кода, не связанной с отладкой, которая его вызвала. Вам обычно не нужно беспокоиться об этом, если вы не пишете отладчик Perl.Конечная точка с запятой, если таковая имеется, может быть опущена из значения EXPR.
-
Под функцией
- Блочный eval
-
Если код, который необходимо выполнить, не меняется, вы можете использовать форму eval-BLOCK для перехвата ошибок во время выполнения без накладных расходов на повторную компиляцию каждый раз. Ошибка, если она есть, всё ещё возвращается в
$@. Примеры:# make divide-by-zero nonfatal eval { $answer = $a / $b; }; warn $@ if $@; # same thing, but less efficient eval '$answer = $a / $b'; warn $@ if $@; # a compile-time error eval { $answer = }; # WRONG # a run-time error eval '$answer ='; # sets $@Если вы хотите перехватывать ошибки при загрузке модуля XS, некоторые проблемы с двоичным интерфейсом (такие как расхождение версий Perl) могут быть фатальными даже с
eval, если$ENV{PERL_DL_NONLAZY}не установлен. См. perlrun.Использование формы
eval {}в качестве механизма перехвата исключений в библиотеках имеет некоторые проблемы. Из-за, скажем так, проблемного состояния__DIE__крючков вы можете не захотеть запускать какие-либо__DIE__крючки, которые могут быть установлены пользователем. Для этой цели вы можете использовать конструкциюlocal $SIG{__DIE__}, как показано в этом примере:# a private exception trap for divide-by-zero eval { local $SIG{'__DIE__'}; $answer = $a / $b; }; warn $@ if $@;Это особенно важно, так как
__DIE__крючки могут вызыватьdieснова, что изменяет их сообщения об ошибках:# __DIE__ hooks may modify error messages { local $SIG{'__DIE__'} = sub { (my $x = $_[0]) =~ s/foo/bar/g; die $x }; eval { die "foo lives here" }; print $@ if $@; # prints "bar lives here" }Поскольку это поощряет действия на расстоянии, это неинтуитивное поведение, возможно, будет исправлено в будущей версии.
eval BLOCKне считается циклом, поэтому операторы управления цикломnext,lastилиredoне могут быть использованы для выхода из блока или перезапуска его.Конечная точка с запятой, если таковая имеется, может быть опущена внутри блока BLOCK.
- evalbytes EXPR
- evalbytes
-
Эта функция похожа на строковый eval, за исключением того, что она всегда анализирует свой аргумент (или
$_, если EXPR опущено) как строку байтов. Если строка содержит какие-либо символы с кодами выше 255, то она не может быть строкой байтов, иevalbytesзавершится с ошибкой, хранящейся в$@.use utf8иno utf8внутри строки имеют свой обычный эффект.Фильтры исходного кода, активированные в выполняемом коде, применяются к самому коду.
evalbytesдоступна начиная с Perl v5.16. Для доступа к ней необходимо указатьCORE::evalbytes, но вы можете опуститьCORE::, если функция"evalbytes"включена. Она автоматически включена при объявленииuse v5.16(или выше) в текущем объёме. - exec LIST
- exec PROGRAM LIST
-
Функция
execвыполняет системную команду и никогда не возвращается; используйтеsystemвместоexec, если хотите получить возвращаемое значение. Она завершается ошибкой и возвращает ложь только если команда не существует и она выполняется напрямую, а не через командную оболочку вашей системы (см. ниже).Так как использование
execвместоsystemявляется распространённой ошибкой, Perl предупреждает вас, еслиexecвызывается в контексте без присвоения значения и если за ней следует оператор, который не являетсяdie,warnилиexit(если включены предупреждения — а вы всегда это делаете, верно?). Если вы действительно хотите выполнить операторexecс каким-либо другим оператором, вы можете использовать один из этих стилей, чтобы избежать предупреждения:exec ('foo') or print STDERR "couldn't exec foo: $!"; { exec ('foo') }; print STDERR "couldn't exec foo: $!";Если в LIST более одного аргумента, это вызывает execvp(3) с аргументами из LIST. Если в LIST только один элемент, аргумент проверяется на наличие метасимволов оболочки, и если они есть, весь аргумент передаётся командной оболочке системы для парсинга (это
/bin/sh -cна платформах Unix, но на других платформах это может отличаться). Если в аргументе нет метасимволов оболочки, он разбивается на слова и передаётся непосредственно вexecvp, что более эффективно. Примеры:exec '/bin/echo', 'Your arguments are: ', @ARGV; exec "sort $outfile | uniq";Если вы не хотите действительно выполнить первый аргумент, а хотите обмануть программу, которую вы выполняете, относительно своего собственного имени, вы можете указать программу, которую вы фактически хотите запустить, как «косвенный объект» (без запятой) перед LIST, как в
exec PROGRAM LIST. (Это всегда принуждает интерпретацию LIST как многозначного списка, даже если в списке есть только один скаляр). Пример:my $shell = '/bin/csh'; exec $shell '-sh'; # pretend it's a login shellили, более прямо:
exec {'/bin/csh'} '-sh'; # pretend it's a login shellКогда аргументы выполняются через командную оболочку, результаты зависят от её особенностей и возможностей. Подробнее см. "`STRING`" в perlop.
Использование косвенного объекта с
execилиsystemтакже более безопасно. Это использование (которое также работает сsystem) принуждает интерпретацию аргументов как многозначного списка, даже если в списке был только один аргумент. Таким образом, вы защищены от расширения оболочкой подстановок или разделения слов с пробелами в них.my @args = ( "echo surprise" ); exec @args; # subject to shell escapes # if @args == 1 exec { $args[0] } @args; # safe even with one-arg listВ первом варианте, без косвенного объекта, выполнялась программа echo, передавая ей
"surprise"аргумент. Во втором варианте этого не происходило; он пытался запустить программу с именем "echo surprise", не нашёл её и установил$?на ненулевое значение, указывающее на ошибку.В Windows, только синтаксис
exec PROGRAM LISTкосвенного объекта надёжно предотвращает использование оболочки;exec LIST, даже с несколькими элементами, вернётся к использованию оболочки, если первый запуск завершится ошибкой.Perl пытается сбросить все файлы, открытые для вывода, перед вызовом exec, но это может быть не поддерживаемо на некоторых платформах (см. perlport). Для безопасности может потребоваться установить
$|($AUTOFLUSHв English) или вызвать методautoflushобъектаIO::Handleдля любых открытых дескрипторов, чтобы избежать потери вывода.Обратите внимание, что
execне вызовет вашиENDблоки, и не вызоветDESTROYметоды ваших объектов.Проблемы с переносимостью: "exec" в perlport.
- exists EXPR
-
Принимая выражение, которое определяет элемент хэша, возвращает истинное значение, если указанный элемент в хэше был когда-либо инициализирован, даже если соответствующее значение является неопределённым.
print "Exists\n" if exists $hash{$key}; print "Defined\n" if defined $hash{$key}; print "True\n" if $hash{$key};exists также может вызываться для элементов массива, но его поведение гораздо менее очевидно и тесно связано с использованием
deleteдля массивов.ПРЕДУПРЕЖДЕНИЕ: Вызов
existsдля значений массивов категорически не рекомендуется. Понятие удаления или проверки существования элементов массива Perl не является концептуально последовательным и может привести к неожиданному поведению.print "Exists\n" if exists $array[$index]; print "Defined\n" if defined $array[$index]; print "True\n" if $array[$index];Элемент хэша или массива может быть истинным только если он определён, а определён только если он существует, но обратное не всегда верно.
Принимая выражение, которое указывает имя подпрограммы, возвращает истинное значение, если указанная подпрограмма была когда-либо объявлена, даже если она не определена. Упоминание имени подпрограммы в exists или defined не считается её объявлением. Обратите внимание, что подпрограмма, которая не существует, всё ещё может быть вызываемой: её пакет может иметь метод
AUTOLOAD, который заставляет её появиться в первый раз при вызове; см. perlsub.print "Exists\n" if exists &subroutine; print "Defined\n" if defined &subroutine;Обратите внимание, что EXPR может быть произвольно сложным, пока конечная операция является поиском ключа хэша или массива или именем подпрограммы:
if (exists $ref->{A}->{B}->{$key}) { } if (exists $hash{A}{B}{$key}) { } if (exists $ref->{A}->{B}->[$ix]) { } if (exists $hash{A}{B}[$ix]) { } if (exists &{$ref->{A}{B}{$key}}) { }Хотя самый вложенный элемент массива или хэша не появится просто потому, что его существование было проверено, все промежуточные элементы будут. Таким образом,
$ref->{"A"}и$ref->{"A"}->{"B"}появятся из-за проверки существования элемента$keyвыше. Это происходит везде, где используется оператор стрелки, включая даже здесь:undef $ref; if (exists $ref->{"Some key"}) { } print $ref; # prints HASH(0x80d3d5c)Использование вызова подпрограммы, а не имени подпрограммы, в качестве аргумента для
existsявляется ошибкой.exists ⊂ # OK exists &sub(); # Error - exit EXPR
- exit
-
Вычисляет EXPR и немедленно завершает программу с этим значением. Пример:
my $ans = <STDIN>; exit 0 if $ans =~ /^[Xx]/;См. также
die. Если EXPR опущено, завершается со статусом0. Единственные общепризнанные значения для EXPR —0для успеха и1для ошибки; другие значения интерпретируются в зависимости от среды выполнения программы Perl. Например, завершение с кодом 69 (EX_UNAVAILABLE) из фильтра входящей почты sendmail приведет к возврату элемента с сообщением об ошибке доставки, но это не всегда так.Не используйте
exitдля прерывания подпрограммы, если есть вероятность, что кто-то захочет поймать произошедшую ошибку. Используйтеdieвместо неё, который может быть пойман с помощьюeval.Функция
exitне всегда завершается немедленно. Она сначала вызывает все определённыеENDпроцедуры, но этиENDпроцедуры могут не прервать завершение. Аналогично, все деструкторы объектов, которые нужно вызвать, вызываются перед фактическим завершением.ENDпроцедуры и деструкторы могут изменить код возврата, изменив$?. Если это проблема, вы можете вызватьPOSIX::_exit($status), чтобы избежатьENDи обработки деструкторов. Подробнее см. perlmod.Проблемы с переносимостью: "exit" в perlport.
- exp EXPR
- exp
-
Возвращает e (основание натурального логарифма) в степени EXPR. Если EXPR опущено, возвращает
exp($_). - fc EXPR
- fc
-
Возвращает строку, преобразованную к нижнему регистру, EXPR. Это внутренняя функция, реализующая escape
\Fв двойных кавычках.Преобразование к нижнему регистру — это процесс сопоставления строк с формой, в которой различия в регистре удалены; сравнение двух строк в их форме с нижним регистром фактически означает проверку равенства двух строк независимо от регистра.
Грубо говоря, если вы когда-либо писали это
lc($this) eq lc($that) # Wrong! # or uc($this) eq uc($that) # Also wrong! # or $this =~ /^\Q$that\E\z/i # Right!Теперь вы можете написать
fc($this) eq fc($that)И получить правильные результаты.
Perl реализует только полную форму преобразования к нижнему регистру, но вы можете получить доступ к простым преобразованиям с помощью "casefold()" в Unicode::UCD и "prop_invmap()" в Unicode::UCD. Дополнительную информацию о преобразовании к нижнему регистру см. в стандарте Unicode, в частности, разделы 3.13
Default Case Operations, 4.2Case-Normative, и 5.18Case Mappings, доступные по адресу https://www.unicode.org/versions/latest/, а также таблицы преобразования регистра, доступные по адресу https://www.unicode.org/charts/case/.Если EXPR опущено, используется
$_.Эта функция ведет себя одинаково при различных пragma, таких как внутри
"use feature 'unicode_strings", как иlc, за исключениемfcLATIN CAPITAL LETTER SHARP S (U+1E9E) в областиuse locale. Преобразование к нижнему регистру этого символа обычно будет"ss", но, как объяснено в разделеlc, изменения регистра, пересекающие границу 255/256, являются проблематичными в контексте локалей и запрещены. Поэтому эта функция в локали возвращает вместо этого строку"\x{17F}\x{17F}", которая является LATIN SMALL LETTER LONG S. Поскольку сам этот символ преобразуется в"s", строка из двух таких символов должна быть эквивалентна одному U+1E9E при преобразовании к нижнему регистру.Хотя стандарт Unicode определяет две дополнительные формы преобразования к нижнему регистру, одну для тюркских языков и одну, которая никогда не отображает один символ в несколько символов, они не предоставляются ядром Perl. Однако модуль CPAN
Unicode::Casingможет быть использован для их реализации.fcдоступна только если включена функция"fc"или если она имеет префиксCORE::. Функция"fc"автоматически включается с объявлениемuse v5.16(или выше) в текущей области. - fcntl FILEHANDLE,FUNCTION,SCALAR
-
Реализует функцию fcntl(2). Скорее всего, вам придётся
use Fcntl;сначала получить правильные определения констант. Обработка аргументов и возвращаемое значение работают так же, как и у
ioctlниже. Например:use Fcntl; my $flags = fcntl($filehandle, F_GETFL, 0) or die "Can't fcntl F_GETFL: $!";Вам не нужно проверять
definedпри возврате изfcntl. Как иioctl, она преобразует значение0из системного вызова в"0 but true"в Perl. Эта строка истинна в булевом контексте и0в числовом контексте. Она также освобождена от стандартныхArgument "..." isn't numericпредупреждений Perl об ошибочных числовых преобразованиях.Обратите внимание, что
fcntlвызывает исключение, если используется на машине, не реализующей fcntl(2). См. модуль Fcntl или страницу справки fcntl(2) для получения информации о доступных на вашей системе функциях.Вот пример установки неблокирующего режима файла с именем
$REMOTEна системном уровне. Вам придётся самостоятельно согласовать$|.use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK); my $flags = fcntl($REMOTE, F_GETFL, 0) or die "Can't get flags for the socket: $!\n"; fcntl($REMOTE, F_SETFL, $flags | O_NONBLOCK) or die "Can't set flags for the socket: $!\n";Проблемы совместимости: "fcntl" в perlport.
- __FILE__
-
Специальный токен, возвращающий имя файла, в котором он встречается. Его можно изменить с помощью механизма, описанного в "Plain Old Comments (Not!)" в perlsyn.
- field VARNAME
-
Объявляет новую переменную поля в текущем классе. Методы и
ADJUSTблоки класса будут иметь доступ к этой переменной так, как будто это лексическая переменная в области видимости в этот момент. - fileno FILEHANDLE
- fileno DIRHANDLE
-
Возвращает дескриптор файла для файлового или директорийного дескриптора или неопределённое значение, если файловый дескриптор не открыт. Если на уровне ОС нет реального дескриптора файла, как это может произойти с файловыми дескрипторами, связанными с объектами памяти через
openсо ссылкой в качестве третьего аргумента, возвращается -1.Это в основном полезно для создания битовых карт для
selectи операций с низким уровнем обработки tty POSIX. Если FILEHANDLE — это выражение, значение используется как косвенный файловый дескриптор, обычно его имя.Вы можете использовать это, чтобы выяснить, ссылаются ли два дескриптора на один и тот же базовый дескриптор:
if (fileno($this) != -1 && fileno($this) == fileno($that)) { print "\$this and \$that are dups\n"; } elsif (fileno($this) != -1 && fileno($that) != -1) { print "\$this and \$that have different " . "underlying file descriptors\n"; } else { print "At least one of \$this and \$that does " . "not have a real file descriptor\n"; }Поведение
filenoдля дескриптора каталога зависит от операционной системы. На системах с dirfd(3) или аналогичной функцией,filenoдля дескриптора каталога возвращает базовый дескриптор файла, связанный с дескриптором; на системах без такой поддержки возвращается неопределённое значение и устанавливается$!(errno). - flock FILEHANDLE,OPERATION
-
Вызывает flock(2) или её эмуляцию для FILEHANDLE. Возвращает true при успехе, false при ошибке. Вызывает ошибку, если используется на машинах, не реализующих flock(2), блокировку fcntl(2) или lockf(3).
flock— это переносимый интерфейс блокировки файлов Perl, хотя он блокирует только целые файлы, а не записи.Два потенциально неочевидных, но традиционных
flockсемантики заключаются в том, что он ожидает бесконечно, пока блокировка не будет предоставлена, и что его блокировки являются просто рекомендательными. Такие дискреционные блокировки более гибкие, но дают меньше гарантий. Это означает, что программы, которые также не используютflock, могут изменять файлы, заблокированные с помощьюflock. См. perlport, документацию по вашей системе и локальные страницы справки вашей системы для получения подробной информации. Лучше всего предположить традиционное поведение, если вы пишете переносимые программы. (Но если вы этого не делаете, вам всегда разрешается писать для особенностей вашей системы (иногда называемых «функциями»). Слишком тщательное соблюдение требований переносимости не должно мешать вам выполнять свою работу.)OPERATION — это одна из констант LOCK_SH, LOCK_EX или LOCK_UN, возможно, с сочетанием LOCK_NB. Эти константы традиционно имеют значения 1, 2, 8 и 4, но вы можете использовать символические имена, если импортируете их из модуля Fcntl, либо по отдельности, либо как группу с помощью тега
:flock. LOCK_SH запрашивает общую блокировку, LOCK_EX запрашивает эксклюзивную блокировку, а LOCK_UN освобождает ранее запрошенную блокировку. Если LOCK_NB побитово соединяется с LOCK_SH или LOCK_EX, тогдаflockвозвращает значение немедленно, а не ожидает блокировки; проверьте возвращаемое значение, чтобы увидеть, получили ли вы её.Для предотвращения возможной несогласованности Perl теперь сбрасывает FILEHANDLE перед блокировкой или разблокировкой.
Обратите внимание, что эмуляция, созданная с помощью lockf(3), не предоставляет общие блокировки и требует, чтобы FILEHANDLE был открыт с намерением записи. Это семантика, которую реализует lockf(3). Большинство, если не все системы, реализуют lockf(3) в терминах блокировки fcntl(2), поэтому различающиеся семантики не должны сильно беспокоить многих пользователей.
Обратите внимание, что эмуляция fcntl(2) для flock(3) требует, чтобы FILEHANDLE был открыт для чтения для использования LOCK_SH и для записи для использования LOCK_EX.
Также обратите внимание, что некоторые версии
flockне могут блокировать вещи по сети; для этого вам необходимо использовать более специфичные для системыfcntl. Если хотите, вы можете заставить Perl игнорировать функцию flock(2) своей системы, а вместо этого предоставить собственную эмуляцию на основе fcntl(2), передав переключатель-Ud_flockпрограмме Configure при настройке и сборке нового Perl.Вот пример приложения, добавляющего почтовые ящики для систем BSD.
# import LOCK_* and SEEK_END constants use Fcntl qw(:flock SEEK_END); sub lock { my ($fh) = @_; flock($fh, LOCK_EX) or die "Cannot lock mailbox - $!\n"; # and, in case we're running on a very old UNIX # variant without the modern O_APPEND semantics... seek($fh, 0, SEEK_END) or die "Cannot seek - $!\n"; } sub unlock { my ($fh) = @_; flock($fh, LOCK_UN) or die "Cannot unlock mailbox - $!\n"; } open(my $mbox, ">>", "/usr/spool/mail/$ENV{'USER'}") or die "Can't open mailbox: $!"; lock($mbox); print $mbox $msg,"\n\n"; unlock($mbox);На системах, поддерживающих реальную flock(2), блокировки наследуются через вызовы
fork, в то время как системы, которые должны использовать более произвольную функцию fcntl(2), теряют свои блокировки, что значительно усложняет написание серверов.См. также DB_File для других примеров
flock.Проблемы совместимости: "flock" в perlport.
- fork
-
Выполняет системный вызов fork(2) для создания нового процесса, выполняющего ту же программу в той же точке. Он возвращает pid дочернего процесса родительскому процессу,
0дочернему процессу илиundef, если вилка неуспешна. Файловые дескрипторы (и иногда блокировки на этих дескрипторах) разделяются, а всё остальное копируется. На большинстве систем, поддерживающих fork(2), уделено большое внимание его высокой эффективности (например, используется технология копирования при изменении страниц данных), что сделало её доминирующей парадигмой многозадачности за последние несколько десятилетий.Perl пытается сбросить все открытые для вывода файлы перед созданием дочернего процесса, но это может не поддерживаться на некоторых платформах (см. perlport). Для безопасности вам может потребоваться установить
$|($AUTOFLUSHв English) или вызвать методautoflushметодаIO::Handleдля любого открытого дескриптора, чтобы избежать дублирования вывода.Если вы
forkбез ожидания своих детей, вы получите зомби. На некоторых системах этого можно избежать, установив$SIG{CHLD}на"IGNORE". См. также perlipc для получения дополнительных примеров создания вилок и сбора мёртвых детей.Обратите внимание, что если ваш дочерний процесс наследует системные файловые дескрипторы, такие как STDIN и STDOUT, которые на самом деле подключены через канал или сокет, даже если вы выйдите, то удалённый сервер (например, скрипт CGI или запущенная на заднем плане работа с удалённой оболочки) не подумает, что вы закончили. Вы должны переоткрыть их в /dev/null, если это проблема.
На некоторых платформах, таких как Windows, где системный вызов fork(2) недоступен, Perl можно скомпилировать для эмуляции
forkв интерпретаторе Perl. Эмуляция спроектирована на уровне программы Perl для максимально возможной совместимости с «Unix» fork(2). Однако, у неё есть ограничения, которые необходимо учитывать в коде, предназначенном для переносимости. См. perlfork для получения более подробной информации.Проблемы совместимости: "fork" в perlport.
- format
-
Объявляет формат для использования функцией
write. Например:format Something = Test: @<<<<<<<< @||||| @>>>>> $str, $%, '$' . int($num) . $str = "widget"; $num = $cost/$quantity; $~ = 'Something'; write;См. perlform для получения подробной информации и примеров.
- formline PICTURE,LIST
-
Это внутренняя функция, используемая
format, но вы можете ее вызвать и самостоятельно. Она форматирует (см. perlform) список значений в соответствии с содержимым PICTURE, помещая вывод в накопитель форматированного вывода,$^A(или$ACCUMULATORв английской версии). В конечном итоге, когда выполняетсяwrite, содержимое$^Aзаписывается в некоторый файловый дескриптор. Вы также можете прочитать$^Aи затем установить$^Aобратно в"". Обратите внимание, что формат, как правило, выполняет одинformlineна строке формы, но функцияformlineсама по себе не заботится о количестве символов новой строки, встроенных в PICTURE. Это означает, что токены~и~~рассматривают все PICTURE как одну строку. Поэтому может потребоваться использовать несколько форматирующих строк для реализации формата одного записываемого элемента, как вformatкомпиляторе.Будьте осторожны, если вы поставите двойные кавычки вокруг картинки, потому что символ
@может восприниматься как начало имени массива.formlineвсегда возвращает true. См. perlform для других примеров.Если вы пытаетесь использовать это вместо
writeдля захвата вывода, вам может быть проще открыть дескриптор файла для скаляра (open my $fh, ">", \$output) и писать в него вместо этого. - getc FILEHANDLE
- getc
-
Возвращает следующий символ из входного файла, связанного с FILEHANDLE, или неопределенное значение в конце файла или при возникновении ошибки (в последнем случае
$!устанавливается). Если FILEHANDLE опущен, считывает со стандартного ввода STDIN. Это не очень эффективно. Однако его нельзя использовать для извлечения отдельных символов без ожидания нажатия пользователем клавиши Enter. Для этого попробуйте что-то более похожее на:if ($BSD_STYLE) { system "stty cbreak </dev/tty >/dev/tty 2>&1"; } else { system "stty", '-icanon', 'eol', "\001"; } my $key = getc(STDIN); if ($BSD_STYLE) { system "stty -cbreak </dev/tty >/dev/tty 2>&1"; } else { system 'stty', 'icanon', 'eol', '^@'; # ASCII NUL } print "\n";Определение того, следует ли установить
$BSD_STYLE, оставлено читателю для самостоятельного решения.Функция
POSIX::getattrможет сделать это более переносимо на системах, претендующих на соответствие POSIX. См. также модульTerm::ReadKeyна CPAN. - getlogin
-
Эта функция реализует одноименную функцию C-библиотеки, которая на большинстве систем возвращает текущий логин из /etc/utmp, если таковой есть. Если она возвращает пустую строку, используйте
getpwuid.my $login = getlogin || getpwuid($<) || "Kilroy";Не рассматривайте
getloginдля аутентификации: она не так безопасна, какgetpwuid.Проблемы переносимости: "getlogin" в perlport.
- getpeername SOCKET
-
Возвращает упакованный адрес sockaddr другого конца соединения SOCKET.
use Socket; my $hersockaddr = getpeername($sock); my ($port, $iaddr) = sockaddr_in($hersockaddr); my $herhostname = gethostbyaddr($iaddr, AF_INET); my $herstraddr = inet_ntoa($iaddr); - getpgrp PID
-
Возвращает текущую группу процессов для указанного PID. Используйте PID
0для получения текущей группы процессов для текущего процесса. Вызовет исключение, если используется на машине, которая не реализует getpgrp(2). Если PID опущен, возвращает группу процессов текущего процесса. Обратите внимание, что POSIX-версияgetpgrpне принимает аргумент PID, поэтому толькоPID==0является действительно переносимой.Проблемы переносимости: "getpgrp" в perlport.
- getppid
-
Возвращает идентификатор процесса родительского процесса.
Примечание для пользователей Linux: между v5.8.1 и v5.16.0 Perl обошел не-POSIX семантику потоков на меньшинстве систем Linux (и системах Debian GNU/kFreeBSD), которые использовали LinuxThreads; эта эмуляция с тех пор была удалена. См. документацию по $$ для подробностей.
Проблемы переносимости: "getppid" в perlport.
- getpriority WHICH,WHO
-
Возвращает текущий приоритет для процесса, группы процессов или пользователя. (См. getpriority(2).) Вызовет фатальное исключение, если используется на машине, которая не реализует getpriority(2).
WHICHможет быть любым изPRIO_PROCESS,PRIO_PGRPилиPRIO_USER, импортированными из "RESOURCE CONSTANTS" в POSIX.Проблемы переносимости: "getpriority" в perlport.
- getpwnam NAME
- getgrnam NAME
- gethostbyname NAME
- getnetbyname NAME
- getprotobyname NAME
- getpwuid UID
- getgrgid GID
- getservbyname NAME,PROTO
- gethostbyaddr ADDR,ADDRTYPE
- getnetbyaddr ADDR,ADDRTYPE
- getprotobynumber NUMBER
- getservbyport PORT,PROTO
- getpwent
- getgrent
- gethostent
- getnetent
- getprotoent
- getservent
- setpwent
- setgrent
- sethostent STAYOPEN
- setnetent STAYOPEN
- setprotoent STAYOPEN
- setservent STAYOPEN
- endpwent
- endgrent
- endhostent
- endnetent
- endprotoent
- endservent
-
Эти подпрограммы идентичны своим аналогам в системной библиотеке C. В контексте списка значения возвращаемые различными функциями get, таковы:
# 0 1 2 3 4 my ( $name, $passwd, $gid, $members ) = getgr* my ( $name, $aliases, $addrtype, $net ) = getnet* my ( $name, $aliases, $port, $proto ) = getserv* my ( $name, $aliases, $proto ) = getproto* my ( $name, $aliases, $addrtype, $length, @addrs ) = gethost* my ( $name, $passwd, $uid, $gid, $quota, $comment, $gcos, $dir, $shell, $expire ) = getpw* # 5 6 7 8 9(Если запись отсутствует, возвращаемое значение — единственное бессмысленное истинное значение.)
Точное значение поля $gcos варьируется, но обычно оно содержит настоящее имя пользователя (в отличие от имени входа) и другую информацию, относящуюся к пользователю. Однако будьте осторожны, так как во многих системах пользователи могут изменять эту информацию, поэтому ей нельзя доверять, и поэтому $gcos является заражённым (см. perlsec). $passwd и $shell, зашифрованный пароль и оболочка пользователя, также являются заражёнными по той же причине.
В скалярном контексте вы получаете имя, если функция не была поиском по имени, в этом случае вы получаете другое значение, что бы это ни было. (Если запись отсутствует, вы получаете неопределённое значение). Например:
my $uid = getpwnam($name); my $name = getpwuid($num); my $name = getpwent(); my $gid = getgrnam($name); my $name = getgrgid($num); my $name = getgrent(); # etc.В getpw*() поля $quota, $comment и $expire являются специальными, поскольку они не поддерживаются во многих системах. Если $quota не поддерживается, он является пустым скаляром. Если он поддерживается, он обычно кодирует квоту на диск. Если поле $comment не поддерживается, оно является пустым скаляром. Если он поддерживается, он обычно кодирует какой-либо административный комментарий о пользователе. В некоторых системах поле $quota может быть $change или $age, поля, связанные с устареванием пароля. В некоторых системах поле $comment может быть $class. Поле $expire, если оно есть, кодирует срок действия учётной записи или пароля. Для доступности и точного значения этих полей в вашей системе, пожалуйста, обратитесь к getpwnam(3) и файлу pwd.h вашей системы. Вы также можете узнать в Perl, что означают ваши поля $quota и $comment и есть ли у вас поле $expire, используя модуль
Configи значенияd_pwquota,d_pwage,d_pwchange,d_pwcomment, иd_pwexpire. Файлы паролей shadow поддерживаются только если ваш поставщик реализовал их интуитивным образом, что вызов обычных функций C-библиотеки возвращает версии shadow, если вы работаете с привилегиями или если существуют функции shadow(3), как в System V (включая Solaris и Linux). Вероятность поддержки систем, реализующих собственную функцию паролей shadow, низка.Значение $members, возвращаемое getgr*(), представляет собой список имен входов членов группы, разделённых пробелами.
Для функций gethost*(), если переменная
h_errnoподдерживается в C, она будет возвращена вам через$?, если вызов функции завершился ошибкой. Значение@addrs, возвращаемое успешным вызовом, представляет собой список сырых адресов, возвращаемых соответствующим вызовом библиотеки. В домене Интернета каждый адрес имеет длину четыре байта; вы можете распаковать его, сказав что-то вроде:my ($w,$x,$y,$z) = unpack('W4',$addr[0]);Библиотека Socket делает это немного проще:
use Socket; my $iaddr = inet_aton("127.1"); # or whatever address my $name = gethostbyaddr($iaddr, AF_INET); # or going the other way my $straddr = inet_ntoa($iaddr);В обратном порядке, для разрешения имени хоста в IP-адрес, вы можете написать это:
use Socket; my $packed_ip = gethostbyname("www.perl.org"); my $ip_address; if (defined $packed_ip) { $ip_address = inet_ntoa($packed_ip); }Убедитесь, что
gethostbynameвызывается в скалярном контексте и что его возвращаемое значение проверяется на определённость.Функция
getprotobynumber, даже если она принимает только один аргумент, имеет приоритет оператора списка, поэтому будьте осторожны:getprotobynumber $number eq 'icmp' # WRONG getprotobynumber($number eq 'icmp') # actually means this getprotobynumber($number) eq 'icmp' # better this wayЕсли вы устали запоминать, какой элемент списка возвращаемого значения содержит какое возвращаемое значение, предоставляются интерфейсы по именам в стандартных модулях:
File::stat,Net::hostent,Net::netent,Net::protoent,Net::servent,Time::gmtime,Time::localtimeиUser::grent. Эти модули переопределяют стандартные встроенные функции, предоставляя версии, которые возвращают объекты с соответствующими именами для каждого поля. Например:use File::stat; use User::pwent; my $is_his = (stat($filename)->uid == pwent($whoever)->uid);Хотя, похоже, это вызовы одного и того же метода (uid), это не так, потому что объект
File::statотличается от объектаUser::pwent.Многие из этих функций небезопасны в многопоточной среде, где более одного потока могут использовать их. В частности, функции, такие как
getpwent()итерируются по процессу, а не по потоку, поэтому, если два потока одновременно итерируются, ни один из них не получит все записи.В некоторых системах существуют потокобезопасные версии некоторых функций, такие как
getpwnam_r()вместоgetpwnam(). В этих случаях Perl автоматически и незаметно заменяет потокобезопасную версию без уведомления. Это означает, что код, который безопасно работает на некоторых системах, может потерпеть неудачу на других, которые не имеют потокобезопасных версий.Проблемы портируемости: "getpwnam" в perlport до "endservent" в perlport.
- getsockname SOCKET
-
Возвращает упакованный адрес sockaddr этого конца соединения SOCKET, в случае, если вы не знаете адрес, потому что у вас есть несколько разных IP-адресов, по которым соединение могло быть установлено.
use Socket; my $mysockaddr = getsockname($sock); my ($port, $myaddr) = sockaddr_in($mysockaddr); printf "Connect to %s [%s]\n", scalar gethostbyaddr($myaddr, AF_INET), inet_ntoa($myaddr); - getsockopt SOCKET,LEVEL,OPTNAME
-
Запрашивает параметр OPTNAME, связанный с SOCKET на заданном уровне LEVEL. Параметры могут существовать на нескольких уровнях протокола в зависимости от типа сокета, но по крайней мере существует самый верхний уровень сокета SOL_SOCKET (определён в модуле
Socket). Чтобы запросить параметры на другом уровне, необходимо указать номер протокола соответствующего протокола, управляющего параметром. Например, чтобы указать, что параметр должен интерпретироваться протоколом TCP, LEVEL должен быть установлен на номер протокола TCP, который можно получить с помощьюgetprotobyname.Функция возвращает упакованную строку, представляющую запрашиваемый параметр сокета, или
undefпри ошибке, а причина ошибки помещается в$!. То, что именно находится в упакованной строке, зависит от LEVEL и OPTNAME; см. getsockopt(2) для получения подробностей. Частый случай заключается в том, что параметр — целое число, в этом случае результат представляет собой упакованное целое число, которое можно декодировать, используяunpackс форматомi(илиI).Вот пример проверки того, включен ли алгоритм Nagle для сокета:
use Socket qw(:all); defined(my $tcp = getprotobyname("tcp")) or die "Could not determine the protocol number for tcp"; # my $tcp = IPPROTO_TCP; # Alternative my $packed = getsockopt($socket, $tcp, TCP_NODELAY) or die "getsockopt TCP_NODELAY: $!"; my $nodelay = unpack("I", $packed); print "Nagle's algorithm is turned ", $nodelay ? "off\n" : "on\n";Проблемы портируемости: "getsockopt" в perlport.
- glob EXPR
- glob
-
В контексте списка возвращает (возможно, пустой) список расширений имён файлов по значению EXPR так, как это сделала бы оболочка Unix Bash. В скалярном контексте glob итерируется по расширениям имён файлов, возвращая
undef, когда список исчерпан. Если EXPR опущено, используется$_.# List context my @txt_files = glob("*.txt"); my @perl_files = glob("*.pl *.pm"); # Scalar context while (my $file = glob("*.mp3")) { # Do stuff }Glob также поддерживает альтернативный синтаксис с использованием
<>в качестве разделителей. Хотя этот синтаксис поддерживается, рекомендуется использоватьglobвместо него, так как он более читабелен и удобен для поиска.my @txt_files = <"*.txt">;Если вам нужна регистронезависимая обработка файлов glob, этого можно добиться, используя параметр
:nocaseмодуляbsd_glob.use File::Glob qw(:globally :nocase); my @txt = glob("readme*"); # README readme.txt Readme.mdОбратите внимание, что
globразделяет свои аргументы по пробелам и рассматривает каждый фрагмент как отдельный шаблон. Таким образом,glob("*.c *.h")соответствует всем файлам с расширением .c или .h. Выражениеglob(".* *")соответствует всем файлам в текущей рабочей директории. Если вы хотите обработать имена файлов, которые могут содержать пробелы, вам нужно использовать дополнительные кавычки вокруг имен файлов со пробелами для защиты. Например, чтобы обработать имена файлов, имеющиеeза которым следует пробел иf, используйте один из следующих вариантов:my @spacies = <"*e f*">; my @spacies = glob('"*e f*"'); my @spacies = glob(q("*e f*"));Если вам нужно получить переменную, вы можете сделать это так:
my @spacies = glob("'*${var}e f*'"); my @spacies = glob(qq("*${var}e f*"));Если непустые фигурные скобки являются единственными символами подстановки, используемыми в
glob, имена файлов не совпадают, но потенциально возвращается множество строк. Например, это генерирует девять строк, по одной на каждую пару фруктов и цветов:my @many = glob("{apple,tomato,cherry}={green,yellow,red}");Этот оператор реализован с помощью стандартного расширения
File::Glob. Подробности см. вbsd_glob, включаяbsd_glob, который не обрабатывает пробелы как разделители шаблонов.Если выражение
globиспользуется в качестве условия для циклаwhileилиfor, оно неявно присваивается$_. Если используется выражениеglobили явное присваивание выраженияglobскаляру как условиеwhile/for, условие фактически проверяет определённость значения выражения, а не его обычное истинностное значение.Подробности реализации:
Это внутренняя функция, реализующая оператор
<*.c>, но вы можете использовать её напрямую. Оператор<*.c>более подробно рассматривается в "I/O Operators" в perlop.Проблемы портируемости: "glob" в perlport.
- gmtime EXPR
- gmtime
-
Работает так же, как
localtime, но возвращаемые значения локализованы для стандартной временной зоны Гринвич.Примечание: при вызове в контексте списка $isdst, последнее возвращаемое значение gmtime, всегда
0. В GMT нет летнего времени.Проблемы портируемости: "gmtime" в perlport.
- goto LABEL
- goto EXPR
- goto &NAME
-
Форма
goto LABELнаходит инструкцию, помеченную меткой LABEL, и возобновляет выполнение там. Она не может быть использована для выхода из блока или подпрограммы, заданнойsort. Она может использоваться для перехода практически в любую другую точку динамической области видимости, включая выход из подпрограмм, но обычно лучше использовать другие конструкции, такие какlastилиdie. Автор Perl никогда не чувствовал необходимости использовать эту формуgoto(в Perl, это так; C - другой вопрос). (Разница заключается в том, что C не предлагает именованные циклы в сочетании с управлением циклами. Perl делает, и это заменяет большинство структурных примененийgotoв других языках.)Форма
goto EXPRожидает оценкиEXPRдо ссылки на код или имени метки. Если она оценивается как ссылка на код, она будет обработана какgoto &NAME, ниже. Это особенно полезно для реализации хвостовой рекурсии с помощьюgoto __SUB__.Если выражение оценивается как имя метки, её область видимости будет решена динамически. Это позволяет использовать вычисляемые
gotoпо образцу FORTRAN, но не рекомендуется, если вы оптимизируете с точки зрения поддержки:goto ("FOO", "BAR", "GLARCH")[$i];Как показано в этом примере,
goto EXPRосвобождается от правила «выглядит как функция». Пара скобок, следующих за ней, не (обязательно) ограничивают её аргумент.goto("NE")."XT"эквивалентноgoto NEXT. Кроме того, в отличие от большинства именованных операторов, у него такой же приоритет, как у присваивания.Использование
goto LABELилиgoto EXPRдля перехода в конструкцию устарело и вызовет предупреждение. Даже в этом случае нельзя переходить в любую конструкцию, требующую инициализации, такую как подпрограмма, циклforeachили блокgiven. В общем случае нельзя переходить в параметр бинарного или спискового оператора, но можно переходить в первый параметр бинарного оператора. (Первым операндом оператора присваивания=является его правый операнд.) Также нельзя переходить в конструкцию, которая оптимизирована.Форма
goto &NAMEзначительно отличается от других формgoto. Фактически, это не goto в обычном смысле, и не имеет той же негативной коннотации, что и другие goto. Вместо этого она завершает текущую подпрограмму (теряя любые изменения, внесённыеlocal) и немедленно вызывает именованную подпрограмму, используя текущее значение@_. Это используется подпрограммамиAUTOLOAD, которые хотят загрузить другую подпрограмму и затем имитировать, что другая подпрограмма была вызвана в первую очередь (за исключением того, что любые изменения в@_в текущей подпрограмме распространяются на другую подпрограмму). Послеgoto, дажеcallerне сможет определить, что эта процедура была вызвана первой.NAME необязательно должно быть именем подпрограммы; это может быть переменная скалярного типа, содержащая ссылку на код или блок, который оценивается как ссылка на код.
- grep BLOCK LIST
- grep EXPR,LIST
-
Это по духу похоже на, но не то же самое, что grep(1) и аналогичные ему утилиты. В частности, оно не ограничено использованием регулярных выражений.
Оценивает BLOCK или EXPR для каждого элемента LIST (локально устанавливая
$_для каждого элемента) и возвращает список элементов, для которых выражение вычисляется как истинное. В скалярном контексте возвращает количество случаев, когда выражение было истинным.my @foo = grep(!/^#/, @bar); # weed out commentsили, что эквивалентно,
my @foo = grep {!/^#/} @bar; # weed out commentsОбратите внимание, что
$_является псевдонимом для списка значений, поэтому его можно использовать для изменения элементов LIST. Хотя это полезно и поддерживается, это может привести к странным результатам, если элементы LIST не являются переменными. Аналогично, grep возвращает псевдонимы в исходный список, так же как переменная индекса цикла for является псевдонимом для элементов списка. То есть, изменение элемента списка, возвращённого grep (например, вforeach,mapили другомgrep) фактически изменяет элемент в исходном списке. Это, как правило, следует избегать при написании ясного кода.См. также
mapдля списка, состоящего из результатов BLOCK или EXPR. - hex EXPR
- hex
-
Интерпретирует EXPR как шестнадцатеричную строку и возвращает соответствующее числовое значение. Если EXPR опущен, используется
$_.print hex '0xAf'; # prints '175' print hex 'aF'; # same $valid_input =~ /\A(?:0?[xX])?(?:_?[0-9a-fA-F])*\z/Шестнадцатеричная строка состоит из шестнадцатеричных цифр и необязательного
0xилиxпрефикса. Каждая шестнадцатеричная цифра может быть предваряема одиночным подчёркиванием, которое будет проигнорировано. Любой другой символ вызывает предупреждение и приводит к игнорированию остальной части строки (даже ведущих пробелов, в отличие отoct). Могут быть представлены только целые числа, а переполнение целых чисел вызывает предупреждение.Для преобразования строк, которые могут начинаться с любого из
0,0x, или0b, см.oct. Чтобы представить что-то как шестнадцатеричное число, обратитесь кprintf,sprintf, иunpack. - import LIST
-
Встроенной функции
importнет. Это просто обычный метод (подпрограмма), определённый (или унаследованный) модулями, которые хотят экспортировать имена в другой модуль. Функцияuseвызывает методimportдля используемого пакета. См. такжеuse, perlmod и Exporter. - index STR,SUBSTR,POSITION
- index STR,SUBSTR
-
Функция index ищет одну строку внутри другой, но без поведения с подстановкой символов, характерного для полного соответствия шаблону регулярного выражения. Она возвращает позицию первого вхождения SUBSTR в STR начиная с POSITION. Если POSITION опущена, поиск начинается с начала строки. Значение POSITION перед началом строки или после её конца обрабатывается так, как если бы оно находилось в начале или в конце соответственно. POSITION и возвращаемое значение нумеруются с нуля. Если подстрока не найдена,
indexвозвращает -1.Поиск символов или строк:
index("Perl is great", "P"); # Returns 0 index("Perl is great", "g"); # Returns 8 index("Perl is great", "great"); # Also returns 8Попытка найти то, чего нет:
index("Perl is great", "Z"); # Returns -1 (not found)Использование смещения для поиска второго вхождения:
index("Perl is great", "e", 5); # Returns 10 - int EXPR
- int
-
Возвращает целую часть EXPR. Если EXPR опущена, используется
$_. Не следует использовать эту функцию для округления: во-первых, она обрезает в сторону0, а во-вторых, машинное представление чисел с плавающей запятой иногда может давать неинтуитивные результаты. Например,int(-6.725/0.025)даёт -268 вместо правильного -269; это потому, что оно на самом деле больше похоже на -268.99999999999994315658. Обычно функцииsprintf,printf, илиPOSIX::floorиPOSIX::ceilбудут работать лучше, чемint. - ioctl FILEHANDLE,FUNCTION,SCALAR
-
Реализует функцию ioctl(2). Вероятно, сначала нужно написать
require "sys/ioctl.ph"; # probably in # $Config{archlib}/sys/ioctl.phчтобы получить правильные определения функций. Если sys/ioctl.ph не существует или не содержит правильных определений, придётся создавать свои, основываясь на файлах заголовков C, таких как <sys/ioctl.h>. (Есть скрипт Perl под названием h2ph, который поставляется с набором Perl, который может помочь, но это нетривиальная задача.) SCALAR будет считываться и/или записываться в зависимости от FUNCTION; указатель C на строковое значение SCALAR будет передан в качестве третьего аргумента фактического вызова
ioctl. (Если у SCALAR нет строкового значения, но есть числовое значение, это значение будет передано вместо указателя на строковое значение. Чтобы гарантировать это, добавьте0к скаляру перед его использованием.) Могут потребоваться функцииpackиunpackдля работы со структурами, используемымиioctl.Возвращаемое значение
ioctl(иfcntl) таково:if OS returns: then Perl returns: -1 undefined value 0 string "0 but true" anything else that numberТаким образом, Perl возвращает true при успехе и false при неудаче, но вы всё ещё можете легко определить фактическое значение, возвращённое операционной системой:
my $retval = ioctl(...) || -1; printf "System returned %d\n", $retval;Специальная строка
"0 but true"освобождена отArgument "..." isn't numericпредупреждений о неправильных числовых преобразованиях.Проблемы переносимости: "ioctl" в perlport.
- join EXPR,LIST
-
Объединяет отдельные строки LIST в одну строку с разделителями, заданными значением EXPR, и возвращает эту новую строку. Пример:
my $rec = join(':', $login,$passwd,$uid,$gid,$gcos,$home,$shell);Обратите внимание, что в отличие от
split,joinне принимает шаблон в качестве первого аргумента. Сравнитеsplit. - keys HASH
- keys ARRAY
-
При вызове в контексте списка возвращает список, содержащий все ключи именованного хэша или, в Perl 5.12 и более поздних версиях, индексы массива. Вызов с массивом в качестве аргумента в версиях Perl до 5.12 вызовет синтаксическую ошибку. В скалярном контексте возвращает количество ключей или индексов.
Элементы хэша возвращаются в, на первый взгляд, случайном порядке. Фактический случайный порядок специфичен для данного хэша; одинаковая последовательность операций над двумя хэшами может привести к разному порядку для каждого хэша. Любое добавление в хэш, а также удаление, может изменить порядок, за исключением последнего ключа, возвращённого функцией
eachилиkeys, который может быть удален без изменения порядка. Пока хэш не изменён, можно полагаться наkeys,valuesиeachдля последовательного возвращения одного и того же порядка. Подробности о том, почему порядок хэша случайный, см. в разделе «Algorithmic Complexity Attacks» в perlsec.В качестве побочного эффекта, вызов
keysсбрасывает внутренний итератор хэша или массива (см.each) перед возвращением ключей. В частности, вызовkeysв контексте void сбрасывает итератор без дополнительных затрат.Вот ещё один способ вывода вашей среды:
my @keys = keys %ENV; my @values = values %ENV; while (@keys) { print pop(@keys), '=', pop(@values), "\n"; }Или, как насчёт сортировки по ключу:
foreach my $key (sort(keys %ENV)) { print $key, '=', $ENV{$key}, "\n"; }Возвращаемые значения являются копиями исходных ключей хэша, поэтому изменение их не повлияет на исходный хэш. Сравните с
values.Для сортировки хэша по значению вам нужно использовать функцию
sort. Вот сортировка хэша по значениям в порядке убывания:foreach my $key (sort { $hash{$b} <=> $hash{$a} } keys %hash) { printf "%4d %s\n", $hash{$key}, $key; }Используя
keysв качестве левостороннего оператора, можно увеличить количество выделенных корзин хэша для данного хэша. Это может обеспечить эффективность, если известно, что хэш будет большим. (Это аналогично предварительному расширению массива, присваивая большее число к $#array.) Если вы напишитеkeys %hash = 200;то в
%hashбудет выделено как минимум 200 корзин — на самом деле 256, поскольку округляется до следующей степени двойки. Эти корзины будут сохранены даже если вы%hash = (), используйтеundef %hashесли хотите освободить хранилище, пока%hashвсё ещё в области видимости. Вы не можете уменьшить количество выделенных корзин хэша с помощьюkeysтаким образом (но вам не нужно беспокоиться об этом случайно, так как попытка не имеет эффекта).keys @arrayв контексте левостороннего оператора — синтаксическая ошибка.Начиная с Perl 5.14, была экспериментальная возможность использовать
keysсо скалярным выражением. Этот эксперимент признан неудачным и был удалён в Perl 5.24.Чтобы избежать создания у пользователей вашего кода, использующих более ранние версии Perl, загадочных синтаксических ошибок, поместите такой код в начало своего файла, чтобы указать, что он будет работать только в Perl недавних версий:
use v5.12; # so keys/values/each work on arrays - kill SIGNAL, LIST
- kill SIGNAL
-
Отправляет сигнал списку процессов. Возвращает количество аргументов, которые были успешно использованы для отправки сигнала (что не обязательно совпадает с количеством фактически убитых процессов, например, когда убита группа процессов).
my $cnt = kill 'HUP', $child1, $child2; kill 'KILL', @goners;SIGNAL может быть либо именем сигнала (строкой), либо номером сигнала. Имя сигнала может начинаться с префикса
SIG, поэтомуFOOиSIGFOOссылаются на один и тот же сигнал. Рекомендуется использовать строковый вид SIGNAL для обеспечения переносимости, поскольку один и тот же сигнал может иметь разные номера в разных операционных системах.Список имён сигналов, поддерживаемых текущей платформой, можно найти в
$Config{sig_name}, который предоставляется модулемConfig. Подробности см. в разделе «Config».Отрицательное имя сигнала эквивалентно отрицательному номеру сигнала, убивая группы процессов вместо отдельных процессов. Например,
kill '-KILL', $pgrpиkill -9, $pgrpотправятSIGKILLвсей указанной группе процессов. Это означает, что вы обычно хотите использовать положительные, а не отрицательные сигналы.Если SIGNAL имеет значение 0 или строку
ZERO(илиSIGZERO), сигнал процессу не отправляется, ноkillпроверяет, возможно ли отправить сигнал (то есть, кратко, процесс принадлежит тому же пользователю или мы являемся суперпользователем). Это полезно для проверки того, что дочерний процесс всё ещё жив (даже если только как «зомби») и не изменил свой UID. См. раздел «perlport» для примечаний о переносимости этого конструкта.Поведение kill, когда номер PROCESS равен нулю или отрицателен, зависит от операционной системы. Например, в соответствии с POSIX, ноль сигнализирует о текущей группе процессов, -1 — обо всех процессах, а любой другой отрицательный номер PROCESS действует как отрицательный номер сигнала и убивает всю указанную группу процессов.
Если и SIGNAL, и PROCESS являются отрицательными, результаты не определены. В будущих версиях может быть выведено предупреждение.
Дополнительные сведения см. в разделе «Signals» в perlipc.
На некоторых платформах, таких как Windows, где системный вызов fork(2) недоступен, Perl может быть скомпилирован для эмуляции
forkна уровне интерпретатора. Эта эмуляция имеет ограничения, связанные с kill, которые необходимо учитывать при работе кода на Windows и в коде, предназначенном для переносимости.Дополнительные сведения см. в perlfork.
Если список LIST процессов отсутствует, сигнал не отправляется, и возвращаемое значение равно 0. Этот вариант иногда используется, однако, поскольку он вызывает запуск проверок на наличие загрязнённых данных, если ваш Perl поддерживает такие проверки. Но см. раздел «Laundering and Detecting Tainted Data» в perlsec.
Проблемы переносимости: «kill» в perlport.
- last LABEL
- last EXPR
- last
-
Команда
lastаналогична операторуbreakв C (используется в циклах); она немедленно завершает цикл. Если LABEL опущен, команда относится к самому внутреннему циклу. Формаlast EXPR, доступная начиная с Perl 5.18.0, позволяет вычислять имя метки во время выполнения и в остальном идентичнаlast LABEL. Блокcontinue, если таковой имеется, не выполняется:LINE: while (<STDIN>) { last LINE if /^$/; # exit when done with header #... }lastне может возвращать значение из блока, который обычно возвращает значение, например, изeval {},sub {}, илиdo {}. Она выполняет свою функцию управления потоком, что исключает любое возвращаемое значение. Не следует использовать её для выхода из операцииgrepилиmap.Обратите внимание, что сам блок семантически идентичен циклу, который выполняется один раз. Таким образом,
lastможет быть использована для эффекта досрочного выхода из такого блока.См. также
continueдля иллюстрации того, как работаютlast,nextиredo.В отличие от большинства именованных операторов, она имеет тот же приоритет, что и присвоение. Она также освобождена от правила «выглядит как функция», поэтому
last ("foo")."bar"приведет к тому, что «bar» станет частью аргумента дляlast. - lc EXPR
- lc
-
Возвращает строку EXPR в нижнем регистре. Если EXPR опущено, используется
$_.my $str = lc("Perl is GREAT"); # "perl is great"Возвращаемое значение зависит от нескольких факторов:
-
Если
use bytesвключена: -
Результаты следуют правилам ASCII. Только символы
A-Zменяются наa-zсоответственно. -
В противном случае, если
use localeдляLC_CTYPEвключена: -
Учитывает текущую локаль
LC_CTYPEдля кодовых точек < 256; и использует правила Unicode для оставшихся кодовых точек (это возможно только в случае, если также установлен флаг UTF8). См. perllocale.Начиная с версии 5.20, Perl использует полные правила Unicode, если локаль UTF-8. В противном случае есть недостаток в этой схеме, заключающийся в том, что изменения регистра, пересекающие границу 255/256, не определены. Например, строчная форма символа LATIN CAPITAL LETTER SHARP S (U+1E9E) в правилах Unicode — U+00DF (на платформах ASCII). Но в
use locale(до версии 5.20 или не UTF-8 локаль), строчная форма U+1E9E — это сам символ, так как 0xDF может не являться LATIN SMALL LETTER SHARP S в текущей локали, и Perl не знает, существует ли этот символ в локали и какова его кодовая точка. Perl возвращает результат, превышающий 255 (почти всегда исходный символ без изменений), для всех случаев (и их не много), где граница 255/256 в противном случае была бы пересечена; и начиная с версии 5.22, он выдает предупреждение о локали. - В противном случае, если у EXPR установлен флаг UTF8:
-
Используются правила Unicode для изменения регистра.
-
В противном случае, если включены
use feature 'unicode_strings'илиuse locale ':not_characters': -
Для изменения регистра используются правила Unicode.
- В противном случае:
-
Используются правила ASCII для изменения регистра. Строчная форма любого символа вне диапазона ASCII — это сам символ.
Примечание: Это внутренняя функция, реализующая escape-последовательность
\Lв двойных кавычках.my $str = "Perl is \LGREAT\E"; # "Perl is great" -
Если
- lcfirst EXPR
- lcfirst
-
Возвращает значение EXPR с первой буквой в нижнем регистре. Это внутренняя функция, реализующая экранирование
\lв строках с двойными кавычками.Если EXPR опущено, используется
$_.Эта функция ведет себя так же при различных предикатах, например, в локали, как и
lc. - length EXPR
- length
-
Возвращает длину в символах значения EXPR. Если EXPR опущено, возвращает длину
$_. Если EXPR не определено, возвращаетundef.Эта функция не может использоваться для подсчета элементов в массиве или хэше целиком. Для этого используйте
scalar @arrayиscalar keys %hash, соответственно.Как и все операции с символами в Perl,
lengthобычно работает с логическими символами, а не физическими байтами. Для того, чтобы узнать, сколько байтов занимает строка, закодированная в UTF-8, используйтеlength(Encode::encode('UTF-8', EXPR))(вам нужно будетuse Encodeсначала). См. Encode и perlunicode. - __LINE__
-
Специальный токен, который компилируется в номер текущей строки. Его можно изменить механизмом, описанным в "Plain Old Comments (Not!)" в perlsyn.
- link OLDFILE,NEWFILE
-
Создаёт новый файл с именем, связанный со старым именем файла. Возвращает true в случае успеха, false в противном случае.
Проблемы переносимости: "link" в perlport.
- listen SOCKET,QUEUESIZE
-
Выполняет то же действие, что и системный вызов listen(2). Возвращает true, если операция прошла успешно, false в противном случае. См. пример в "Sockets: Client/Server Communication" в perlipc.
- local EXPR
-
На самом деле, вам, вероятно, следует использовать
myвместо этого, потому чтоlocalне является тем, что большинство людей понимают под "локальным". Подробности см. в "Private Variables via my()" в perlsub.Оператор local изменяет перечисленные переменные, чтобы сделать их локальными для окружающего блока, файла или eval. Если перечисляется более одного значения, список должен быть помещён в скобки. Подробности, включая проблемы с привязанными массивами и хэшами, см. в "Temporary Values via local()" в perlsub.
Конструкцию
delete local EXPRтакже можно использовать для локализации удаления элементов массива/хэша в текущий блок. См. "Localized deletion of elements of composite types" в perlsub. - localtime EXPR
- localtime
-
Преобразует время, возвращённое функцией time, в список из 9 элементов, с анализом времени по часовому поясу. Обычно используется следующим образом:
# 0 1 2 3 4 5 6 7 8 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);Все элементы списка являются числовыми и взяты непосредственно из C-структуры `struct tm'.
$sec,$min, и$hour— секунды, минуты и часы указанного времени.$mday— день месяца, а$mon— месяц в диапазоне0..11, где 0 соответствует январю, а 11 — декабрю. Это упрощает получение имени месяца из списка:my @abbr = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); print "$abbr[$mon] $mday"; # $mon=9, $mday=18 gives "Oct 18"$yearсодержит количество лет с 1900 года. Чтобы получить полный год, напишите:$year += 1900;Чтобы получить последние две цифры года (например, "01" в 2001 году), сделайте следующее:
$year = sprintf("%02d", $year % 100);$wday— день недели, где 0 соответствует воскресенью, а 3 — среде.$yday— день года, в диапазоне0..364(или0..365в високосном году).$isdst— true, если указанное время приходится на период действия летнего времени, и false в противном случае.Если EXPR опущено,
localtimeиспользует текущее время (как возвращаетсяtime).В скалярном контексте
localtimeвозвращает значение ctime(3):my $now_string = localtime; # e.g., "Thu Oct 13 04:54:34 1994"Это скалярное значение всегда на английском языке и не зависит от локали. Чтобы получить аналогичные, но зависящие от локали строковые представления дат, попробуйте, например:
use POSIX qw(strftime); my $now_string = strftime "%a %b %e %H:%M:%S %Y", localtime; # or for GMT formatted appropriately for your locale: my $now_string = strftime "%a %b %e %H:%M:%S %Y", gmtime;C$now_string> будет отформатирован в соответствии с текущей локалью LC_TIME, в которой работает программа или поток. См. perllocale для настройки и изменения этой локали. Обратите внимание, что
%aи%b, краткие формы дня недели и месяца, могут не обязательно иметь ширину в три символа.Модули Time::gmtime и Time::localtime предоставляют удобный механизм доступа по именам к функциям
gmtimeиlocaltime, соответственно.Для всеобъемлющего представления даты и времени см. модуль DateTime на CPAN.
Для получения GMT вместо местного времени используйте встроенную функцию
gmtime.См. также модуль
Time::Local(для преобразования секунд, минут, часов и т. д. обратно в целое значение, возвращаемоеtime), и функциюmktimeмодуля POSIX.Проблемы переносимости: "localtime" в perlport.
- lock THING
-
Эта функция размещает консультативный замок на общей переменной или объекте, на который ссылается THING, до тех пор, пока замок не выйдет из области видимости.
Возвращаемое значение — это сам скаляр, если аргумент является скаляром, или ссылка, если аргумент является хэшем, массивом или подпрограммой.
lock— "слабое ключевое слово"; это означает, что если вы определили функцию с таким именем (до любых вызовов), эта функция будет вызвана вместо неё. Если вы не работаете вuse threads::shared, это ничего не делает. См. threads::shared. - log EXPR
- log
-
Возвращает натуральный логарифм (по основанию e) числа EXPR. Если EXPR опущено, возвращает логарифм
$_. Чтобы получить логарифм по другому основанию, используйте элементарную алгебру: логарифм по основанию N числа равен натуральному логарифму этого числа, деленному на натуральный логарифм N. Например:sub log10 { my $n = shift; return log($n)/log(10); }См. также
expдля обратной операции. - lstat FILEHANDLE
- lstat EXPR
- lstat DIRHANDLE
- lstat
-
Выполняет то же, что и функция
stat(включая установку специального_файлового дескриптора), но производит статистику символьной ссылки, а не файла, на который она указывает. Если символьные ссылки не реализованы на вашей системе, выполняется обычнаяstat. Для более подробной информации см. документацию поstat.Если EXPR опущено, производит статистику
$_.Проблемы переносимости: "lstat" в perlport.
- m//
-
Оператор сопоставления. См. "Regexp Quote-Like Operators" в perlop.
- map BLOCK LIST
- map EXPR,LIST
-
Вычисляет блок или EXPR для каждого элемента списка LIST (локально устанавливая
$_для каждого элемента) и формирует список результатов каждого такого вычисления. Каждый элемент LIST может породить ноль, одно или несколько элементов в генерируемом списке, поэтому количество элементов в генерируемом списке может отличаться от количества элементов в LIST. В скалярном контексте возвращает общее количество сгенерированных элементов. В списковом контексте возвращает генерируемый список.my @chars = map(chr, @numbers);преобразует список чисел в соответствующие символы.
my @squares = map { $_ * $_ } @numbers;преобразует список чисел в их квадраты.
my @squares = map { $_ > 5 ? ($_ * $_) : () } @numbers;показывает, что количество возвращённых элементов может отличаться от количества входных элементов. Чтобы пропустить элемент, верните пустой список (). Это также можно сделать, написав
my @squares = map { $_ * $_ } grep { $_ > 5 } @numbers;что делает намерение более ясным.
Map всегда возвращает список, который может быть присвоен хэшу, так что элементы станут парами ключ/значение. Подробности см. в perldata.
my %hash = map { get_a_key_for($_) => $_ } @array;просто другой способ написать
my %hash; foreach (@array) { $hash{get_a_key_for($_)} = $_; }Обратите внимание, что
$_является псевдонимом для списка значений, поэтому его можно использовать для изменения элементов списка LIST. Хотя это полезно и поддерживается, это может привести к странным результатам, если элементы LIST не являются переменными. В большинстве случаев для этой цели использование обычного циклаforeachбыло бы более понятным. См. такжеgrepдля списка, составленного из тех элементов исходного списка, для которых блок или выражение оцениваются как истинные.{начинает как ссылки на хэши, так и блоки, поэтомуmap { ...может быть либо началом map BLOCK LIST, либо map EXPR, LIST. Так как Perl не предвидит закрывающий}, ему приходится угадывать, с чем он имеет дело, основываясь на том, что он находит сразу после{. Обычно он угадывает правильно, но если нет, то он не поймет, что что-то не так, пока не дойдет до}и не столкнется с отсутствующей (или неожиданной) запятой. Ошибка синтаксиса будет сообщена вблизи}, но вам нужно будет изменить что-то около{, например, используя унарный+или точку с запятой, чтобы помочь Perl:my %hash = map { "\L$_" => 1 } @array # perl guesses EXPR. wrong my %hash = map { +"\L$_" => 1 } @array # perl guesses BLOCK. right my %hash = map {; "\L$_" => 1 } @array # this also works my %hash = map { ("\L$_" => 1) } @array # as does this my %hash = map { lc($_) => 1 } @array # and this. my %hash = map +( lc($_) => 1 ), @array # this is EXPR and works! my %hash = map ( lc($_), 1 ), @array # evaluates to (1, @array)или для принудительного использования анонимного конструктора хэша используйте
+{:my @hashes = map +{ lc($_) => 1 }, @array # EXPR, so needs # comma at endдля получения списка анонимных хэшей, каждый с только одним входом.
- method NAME BLOCK
- method NAME : ATTRS BLOCK
-
Создает новый именованный метод в области видимости класса, в котором он объявлен. Это допустимо только внутри объявления
class. - mkdir FILENAME,MODE
- mkdir FILENAME
- mkdir
-
Создаёт директорию, указанную в FILENAME, с разрешениями, заданными MODE (с учётом
umask). В случае успеха возвращает true; в противном случае — false и устанавливает$!(errno). MODE по умолчанию равен 0777, если не указан, а FILENAME по умолчанию равен$_, если не указан.В общем случае лучше создавать директории с широкими разрешениями MODE и позволять пользователю изменять их с помощью своего
umask, чем задавать ограниченные разрешения MODE и не давать пользователю возможности расширить их. Исключение составляют случаи, когда файл или директория должны быть скрытыми (например, почтовые файлы). Документация дляumaskподробно рассматривает выбор MODE.Обратите внимание, что в соответствии с POSIX 1003.1-1996 FILENAME может иметь любое количество конечных слэшей. Некоторые операционные системы и файловые системы не поддерживают эту функцию корректно, поэтому Perl автоматически удаляет все конечные слэши, чтобы обеспечить совместимость.
Для рекурсивного создания структуры директорий обратитесь к функции
make_pathмодуля File::Path. - msgctl ID,CMD,ARG
-
Вызывает функцию System V IPC msgctl(2). Вероятно, вам придётся выполнить
use IPC::SysV;чтобы получить правильные константы. Если CMD равен
IPC_STAT, то ARG должен быть переменной, которая будет содержать возвращаемуюmsqid_dsструктуру. Возвращает значения, подобноioctl: undefined для ошибки,"0 but true"для нуля или фактическое возвращаемое значение в противном случае. См. также "SysV IPC" в perlipc и документацию дляIPC::SysVиIPC::Semaphore.Вопросы переносимости: "msgctl" в perlport.
- msgget KEY,FLAGS
-
Вызывает функцию System V IPC msgget(2). Возвращает идентификатор очереди сообщений или
undefв случае ошибки. См. также "SysV IPC" в perlipc и документацию дляIPC::SysVиIPC::Msg.Вопросы переносимости: "msgget" в perlport.
- msgrcv ID,VAR,SIZE,TYPE,FLAGS
-
Вызывает функцию System V IPC msgrcv для получения сообщения из очереди сообщений ID в переменную VAR с максимальным размером сообщения SIZE. Обратите внимание, что при получении сообщения тип сообщения как целое число в формате языка будет первым элементом в VAR, за которым следует само сообщение. Такую упаковку можно открыть с помощью
unpack("l! a*"). Применяет мечение (таинство). Возвращает true при успехе, false в случае ошибки. См. также "SysV IPC" в perlipc и документацию дляIPC::SysVиIPC::Msg.Вопросы переносимости: "msgrcv" в perlport.
- msgsnd ID,MSG,FLAGS
-
Вызывает функцию System V IPC msgsnd для отправки сообщения MSG в очередь сообщений ID. MSG должен начинаться с типа сообщения в формате целого числа языка, за которым следует само сообщение. Такую упаковку можно получить с помощью
pack("l! a*", $type, $message). Возвращает true при успехе, false в случае ошибки. См. также "SysV IPC" в perlipc и документацию дляIPC::SysVиIPC::Msg.Вопросы переносимости: "msgsnd" в perlport.
- my VARLIST
- my TYPE VARLIST
- my VARLIST : ATTRS
- my TYPE VARLIST : ATTRS
-
Оператор
myобъявляет перечисленные переменные локальными (лексическими) для окружающего блока, файла илиeval. Если перечисляется более одной переменной, список должен быть помещён в скобки.Обратите внимание, что со списком в скобках,
undefможно использовать в качестве заполнителя, например, для пропуска начального присвоения значений:my ( undef, $min, $hour ) = localtime;Переопределение переменной в том же объёме или операторе «затеняет» предыдущее объявление, создавая новую экземпляцию и препятствуя доступу к предыдущей. Обычно это нежелательно и, если включены предупреждения, приведёт к появлению предупреждения в категории
shadow.Точные семантика и интерфейс TYPE и ATTRS ещё разрабатываются. TYPE может быть идентификатором, константой, объявленной с помощью
use constant, или__PACKAGE__. В настоящее время это связано с использованием псевдонима fields, а атрибуты обрабатываются с помощью псевдонима attributes или, начиная с Perl 5.8.0, также с помощью модуля Attribute::Handlers. Подробности см. в "Private Variables via my()" в perlsub. - next LABEL
- next EXPR
- next
-
Команда
nextподобна командеcontinueв C; она запускает следующую итерацию цикла:LINE: while (<STDIN>) { next LINE if /^#/; # discard comments #... }Обратите внимание, что если бы существовал блок
continueв вышеприведённом примере, он был бы выполнен даже для пропущенных строк. Если LABEL опущен, команда относится к самому внутреннему вложенному циклу. Форматnext EXPR, доступный начиная с Perl 5.18.0, позволяет имя метки вычислять во время выполнения, в остальном он идентиченnext LABEL.nextне может вернуть значение из блока, который обычно возвращает значение, такого какeval {},sub {}, илиdo {}. Она выполнит своё поведение потока управления, что исключает возвращаемое значение. Не следует использовать её для выхода из операцииgrepилиmap.Обратите внимание, что сам блок семантически идентичен циклу, который выполняется один раз. Таким образом,
nextпрервёт такой блок раньше.См. также
continueдля иллюстрации того, какlast,nextиredoработают.В отличие от большинства именованных операторов, у неё тот же приоритет, что и у присваивания. Она также освобождена от правила «выглядит как функция», поэтому
next ("foo")."bar"приведёт к тому, что «bar» станет частью аргумента дляnext. - no MODULE VERSION LIST
- no MODULE VERSION
- no MODULE LIST
- no MODULE
- no VERSION
- oct EXPR
- oct
-
Интерпретирует EXPR как строку в восьмеричной системе счисления и возвращает соответствующее значение. Восьмеричная строка состоит из восьмеричных цифр и, начиная с Perl 5.33.5, необязательного префикса
0oилиo. Каждая восьмеричная цифра может предваряться одиночным символом нижнего подчеркивания, который будет проигнорирован. (Если EXPR начинается с0xилиx, интерпретируется как шестнадцатеричная строка. Если EXPR начинается с0bилиb, интерпретируется как двоичная строка. Пробелы в начале игнорируются во всех трёх случаях.) Следующее обработает десятичные, двоичные, восьмеричные и шестнадцатеричные значения в стандартной нотации Perl:$val = oct($val) if $val =~ /^0/;Если EXPR пропущен, используется
$_. Для выполнения обратной операции (получить число в восьмеричном формате) используйтеsprintfилиprintf:my $dec_perms = (stat("filename"))[2] & 07777; my $oct_perm_str = sprintf "%o", $perms;Функция
octобычно используется, когда строка, например,644, должна быть преобразована в режим файла.Хотя Perl автоматически преобразует строки в числа по мере необходимости, это автоматическое преобразование предполагает основание 10. Пробелы в начале игнорируются без предупреждения, как и любые конечные символы, не являющиеся цифрами, такие как десятичная точка (функция
octобрабатывает только неотрицательные целые числа, а не отрицательные целые числа или числа с плавающей запятой). - open FILEHANDLE,MODE,EXPR
- open FILEHANDLE,MODE,EXPR,LIST
- open FILEHANDLE,MODE,REFERENCE
- open FILEHANDLE,EXPR
- open FILEHANDLE
-
Ассоциирует внутренний FILEHANDLE с внешним файлом, указанным EXPR. Этот файловый дескриптор затем позволит выполнять операции ввода-вывода с этим файлом, такие как чтение из него или запись в него.
Вместо имени файла вы можете указать внешнюю команду (плюс необязательный список аргументов) или скалярную ссылку, чтобы открыть файловые дескрипторы для команд или скаляров в памяти соответственно.
Подробная справка по
openприведена ниже. Для более легкого знакомства с основамиopen, см. также страницу руководства perlopentut.- Работа с файлами
-
Чаще всего,
openвызывается с тремя аргументами: необходимым FILEHANDLE (обычно пустая скалярная переменная), за которым следует MODE (обычно литерал, описывающий режим ввода-вывода, который будет использовать файловый дескриптор), а затем имя файла, к которому будет ссылаться новый файловый дескриптор.- Простые примеры
-
Чтение из файла:
open(my $fh, "<", "input.txt") or die "Can't open < input.txt: $!"; # Process every line in input.txt while (my $line = readline($fh)) { # # ... do something interesting with $line here ... # }или запись в него:
open(my $fh, ">", "output.txt") or die "Can't open > output.txt: $!"; print $fh "This line gets printed into output.txt.\n";Для получения сводки общих операций с файловыми дескрипторами, таких как эти, см. "Файлы и ввод-вывод" в perlintro.
- О файловых дескрипторах
-
Первый аргумент
open, обозначенный FILEHANDLE в этом справочнике, обычно является скалярной переменной. (Существуют исключения, описанные в разделе «Другие соображения» ниже.) Если вызовopenуспешен, то выражение, предоставленное в качестве FILEHANDLE, получит присвоенный открытый файловый дескриптор. Этот файловый дескриптор предоставляет внутреннюю ссылку на указанный внешний файл, удобно хранящийся в переменной Perl, и готовый к операциям ввода-вывода, таким как чтение и запись. - О режимах
-
При вызове
openс тремя или более аргументами второй аргумент — обозначенный здесь MODE — определяет режим открытия. MODE обычно представляет собой строковый литерал, содержащий специальные символы, определяющие предполагаемую роль файлового дескриптора при вводе-выводе: только чтение, чтение и запись и так далее.Если MODE равен
<, файл открывается для чтения (только чтение). Если MODE равен>, файл открывается для записи, при этом существующие файлы сначала обрезаются («перезаписываются»), а несуществующие файлы создаются.Если MODE равен
>>, файл открывается для добавления, снова создаётся, если необходимо.Вы можете поместить
+перед>или<, чтобы указать, что вы хотите иметь доступ как для чтения, так и для записи в файл; таким образом,+<почти всегда предпочтительнее для обновлений чтения/записи — режим+>сначала перезапишет файл. Как правило, вы не можете использовать режим чтения/записи для обновления текстовых файлов, так как они имеют записи переменной длины. См. переключатель -i в perlrun для лучшего подхода. Файл создаётся с разрешениями0666изменёнными значением маски процессаumask.Эти различные префиксы соответствуют режимам fopen(3)
r,r+,w,w+,a, иa+.Дополнительные примеры различных режимов в действии:
# Open a file for concatenation open(my $log, ">>", "/usr/spool/news/twitlog") or warn "Couldn't open log file; discarding input"; # Open a file for reading and writing open(my $dbase, "+<", "dbase.mine") or die "Can't open 'dbase.mine' for update: $!"; - Проверка возвращаемого значения
-
Open возвращает ненулевое значение при успехе, значение undefined в противном случае. Если
openвключала трубу, возвращаемым значением оказывается pid дочернего процесса.При открытии файла редко бывает хорошей идеей продолжать, если запрос не удался, поэтому
openчасто используется сdie. Даже если вы хотите, чтобы ваш код делал что-то помимоdieпри неудачном открытии, вы всё равно должны проверять возвращаемое значение при открытии файла.
- Указание слоев ввода-вывода в MODE
-
Вы можете использовать трёхаргументную форму open, чтобы указать слои ввода-вывода (иногда называемые «дисциплинами»), которые нужно применить к новому файловому дескриптору. Они влияют на обработку входных и выходных данных (подробнее см. open и PerlIO). Например:
# loads PerlIO::encoding automatically open(my $fh, "<:encoding(UTF-8)", $filename) || die "Can't open UTF-8 encoded $filename: $!";Это открывает файл в кодировке UTF8, содержащий символы Юникода; см. perluniintro. Обратите внимание, что если слои указаны в трёхаргументной форме, то значения по умолчанию, хранящиеся в
${^OPEN}(обычно устанавливаемые прагмой open или переключателем-CioD) игнорируются. Эти слои также будут проигнорированы, если вы укажете двоеточие без последующего имени. В этом случае используется слой по умолчанию для операционной системы (:raw в Unix, :crlf в Windows).В некоторых системах (в основном системах на основе DOS и Windows)
binmodeнеобходим, когда вы работаете не с текстовым файлом. Для обеспечения переносимости рекомендуется всегда использовать его, когда это уместно, и никогда не использовать его, когда это не уместно. Также люди могут установить свой ввод-вывод по умолчанию в кодировке UTF8, а не в байтах. -
Использование
undefдля временных файлов -
В качестве специального случая трёхаргументная форма с режимом чтения/записи и третьим аргументом, равным
undef:open(my $tmp, "+>", undef) or die ...открывает файловый дескриптор для только что созданного пустого анонимного временного файла. (Это происходит в любом режиме, что делает
+>единственным полезным и разумным режимом для использования.) Вам потребуетсяseek, чтобы выполнить чтение. - Открытие файлового дескриптора в скаляр памяти
-
Вы можете открыть файловые дескрипторы непосредственно к скалярам Perl вместо файла или другого ресурса, внешнего для программы. Для этого передайте ссылку на этот скаляр в качестве третьего аргумента
open, как показано ниже:open(my $memory, ">", \$var) or die "Can't open memory file: $!"; print $memory "foo!\n"; # output will appear in $varЧтобы (снова) открыть
STDOUTилиSTDERRкак файл в памяти, закройте его сначала:close STDOUT; open(STDOUT, ">", \$variable) or die "Can't open STDOUT: $!";Скаляры для файлов в памяти обрабатываются как строковые значения байтов: если файл не открывается с обрезкой, скаляр не может содержать никаких кодовых точек больше 0xFF.
Открытие файлов в памяти может завершиться неудачей по различным причинам. Как и с любым другим
open, проверьте возвращаемое значение на успех.Технические примечание: Эта функция работает только при компиляции Perl с PerlIO — по умолчанию, за исключением устаревших (до 5.16) установок Perl, которые были сконфигурированы так, чтобы не включать его (например, с помощью
Configure -Uuseperlio). Вы можете узнать, была ли ваша версия Perl скомпилирована с PerlIO, выполнивperl -V:useperlio. Если вывод будет'define', у вас есть PerlIO; в противном случае нет.См. perliol для подробной информации о PerlIO.
- Открытие файлового дескриптора в команду
-
Если MODE равен
|-, то имя файла интерпретируется как команда, для которой нужно перенаправить вывод, а если MODE равен-|, то имя файла интерпретируется как команда, которая перенаправляет вывод к нам. В форме с двумя (и одним) аргументом следует заменить дефис (-) на команду. См. "Использование open() для IPC" в perlipc для получения дополнительных примеров этого. (Вам не разрешеноopenв команду, которая перенаправляет как вход, так и вывод, но см. IPC::Open2, IPC::Open3, и "Взаимодействие с другим процессом" в perlipc для альтернатив.)open(my $article_fh, "-|", "caesar <$article") # decrypt # article or die "Can't start caesar: $!"; open(my $article_fh, "caesar <$article |") # ditto or die "Can't start caesar: $!"; open(my $out_fh, "|-", "sort >Tmp$$") # $$ is our process id or die "Can't start sort: $!";В форме открытия трубы, принимающей три или более аргументов, если указан LIST (дополнительные аргументы после имени команды), то LIST становится аргументами вызываемой команды, если платформа это поддерживает. Значение
openс более чем тремя аргументами для режимов, не являющихся трубами, ещё не определено, но экспериментальные «слои» могут придать дополнительным аргументам LIST смысл.Если вы открываете трубу для команды
-(то есть, указываете либо|-или-|с одно- или двухаргументными формамиopen), выполняется неявноеfork, поэтомуopenвозвращает дважды: в родительском процессе он возвращает pid дочернего процесса, а в дочернем процессе он возвращает (определённое)0. Используйтеdefined($pid)или//для определения успеха открытия.Например, используйте либо
my $child_pid = open(my $from_kid, "-|") // die "Can't fork: $!";или
my $child_pid = open(my $to_kid, "|-") // die "Can't fork: $!";за которым следует
if ($child_pid) { # am the parent: # either write $to_kid or else read $from_kid ... waitpid $child_pid, 0; } else { # am the child; use STDIN/STDOUT normally ... exit; }Файловый дескриптор ведёт себя нормально для родительского процесса, но ввод-вывод для этого файлового дескриптора перенаправляется из/в стандартный вывод/стандартный ввод дочернего процесса. В дочернем процессе файловый дескриптор не открывается — ввод-вывод происходит из/в новый стандартный вывод/стандартный ввод. Как правило, это используется как обычное открытие трубы, когда вы хотите получить больший контроль над тем, как выполняется команда трубы, например, при запуске setuid, и вы не хотите просматривать команды оболочки на предмет метасимволов.
Следующие блоки более или менее эквивалентны:
open(my $fh, "|tr '[a-z]' '[A-Z]'"); open(my $fh, "|-", "tr '[a-z]' '[A-Z]'"); open(my $fh, "|-") || exec 'tr', '[a-z]', '[A-Z]'; open(my $fh, "|-", "tr", '[a-z]', '[A-Z]'); open(my $fh, "cat -n '$file'|"); open(my $fh, "-|", "cat -n '$file'"); open(my $fh, "-|") || exec "cat", "-n", $file; open(my $fh, "-|", "cat", "-n", $file);Последние два примера в каждом блоке показывают трубу в «формате списка», который пока не поддерживается на всех платформах. (Если ваша платформа имеет реальный
fork, такой как Linux и macOS, вы можете использовать формат списка; он также работает в Windows с Perl 5.22 или более поздними версиями.) Вы захотите использовать список форм трубы, чтобы вы могли передавать буквальные аргументы команде, не рискуя тем, что оболочка интерпретирует какие-либо метасимволы оболочки в них. Однако это также лишает вас возможности открывать трубы для команд, которые намеренно содержат метасимволы оболочки, такие как:open(my $fh, "|cat -n | expand -4 | lpr") || die "Can't open pipeline to lpr: $!";См. "Безопасные открытия труб" в perlipc для получения дополнительных примеров.
- Дублирование файловых дескрипторов
-
Вы также можете, следуя традиции Bourne shell, указать EXPR, начинающийся с
>&, в этом случае остальная часть строки интерпретируется как имя дескриптора файла (или номер дескриптора файла, если числовое значение), который необходимо дублировать (как в dup(2)) и открыть. Вы можете использовать&после>,>>,<,+>,+>>, и+<. Указанный режим должен соответствовать режиму исходного дескриптора файла. (Дублирование дескриптора файла не учитывает какие-либо существующие содержимое буферов ввода-вывода.) Если вы используете форму с тремя аргументами, вы можете передать число, имя дескриптора файла или обычное "ссылку на шаблон".Вот скрипт, который сохраняет, перенаправляет и восстанавливает
STDOUTиSTDERRс помощью различных методов:#!/usr/bin/perl open(my $oldout, ">&STDOUT") or die "Can't dup STDOUT: $!"; open(OLDERR, ">&", \*STDERR) or die "Can't dup STDERR: $!"; open(STDOUT, '>', "foo.out") or die "Can't redirect STDOUT: $!"; open(STDERR, ">&STDOUT") or die "Can't dup STDOUT: $!"; select STDERR; $| = 1; # make unbuffered select STDOUT; $| = 1; # make unbuffered print STDOUT "stdout 1\n"; # this works for print STDERR "stderr 1\n"; # subprocesses too open(STDOUT, ">&", $oldout) or die "Can't dup \$oldout: $!"; open(STDERR, ">&OLDERR") or die "Can't dup OLDERR: $!"; print STDOUT "stdout 2\n"; print STDERR "stderr 2\n";Если вы укажете
'<&=X', гдеX— это номер дескриптора файла или имя дескриптора файла, Perl выполнит эквивалент C's fdopen(3) для этого дескриптора файла (и не вызовет dup(2)); это более экономно использует дескрипторы файлов. Например:# open for input, reusing the fileno of $fd open(my $fh, "<&=", $fd)или
open(my $fh, "<&=$fd")или
# open for append, using the fileno of $oldfh open(my $fh, ">>&=", $oldfh)Экономия дескрипторов файлов также полезна (помимо экономии) например, когда что-то зависит от дескрипторов файлов, например, для блокировки с помощью
flock. Если вы используете толькоopen(my $A, ">>&", $B), дескриптор файла$Aне будет иметь тот же дескриптор файла, что и$B, и поэтомуflock($A)не будетflock($B)и наоборот. Но сopen(my $A, ">>&=", $B), дескрипторы файлов будут использовать тот же системный дескриптор файла.Обратите внимание, что в Perl'ях, более старых, чем 5.8.0, Perl использует стандартную C-библиотеку fdopen(3) для реализации функциональности
=. Во многих Unix-системах fdopen(3) завершается неудачей, когда дескрипторы файлов превышают определенное значение, обычно 255. Для Perl 5.8.0 и более поздних версий PerlIO является (чаще всего) значением по умолчанию. - Использование устаревших приёмов
-
Этот раздел описывает способы вызова
openвне рамок лучших практик; вы можете встретить такие примеры в более старом коде. Perl не считает их использование устаревшим, но и не рекомендует их в новом коде ради ясности и читабельности.- Указание режима и имени файла как одного аргумента
-
В формах вызова с одним и двумя аргументами режим и имя файла должны быть конкатенированы (в указанном порядке), предпочтительно разделенные пробелами. Вы можете (но не должны) опустить режим в этих формах, когда этот режим равен
<. Безопасно использовать двухаргументную формуopen, если аргумент имени файла является известной литеральной строкой.open(my $dbase, "+<dbase.mine") # ditto or die "Can't open 'dbase.mine' for update: $!";В двухаргументной (и одноаргументной) форме открытие
<-или-открывает STDIN, а открытие>-открывает STDOUT.Новый код должен отдавать предпочтение форме с тремя аргументами
openпо сравнению со старой формой. Объявление режима и имени файла как двух отдельных аргументов избегает любых неточностей между этими двумя. -
Вызов
openс одним аргументом через глобальные переменные -
В качестве сокращения одноаргументный вызов берет имя файла из глобальной скалярной переменной с тем же именем, что и дескриптор файла:
$ARTICLE = 100; open(ARTICLE) or die "Can't find article $ARTICLE: $!\n";Здесь
$ARTICLEдолжна быть глобальной скалярной переменной (пакета) — не той, которая объявлена сmyилиstate. - Присваивание дескриптора файла "головому слову"
-
Более старый стиль состоит в использовании "голого слова" в качестве дескриптора файла, как
open(FH, "<", "input.txt") or die "Can't open < input.txt: $!";Тогда вы можете использовать
FHв качестве дескриптора файла, вclose FHи<FH>и так далее. Обратите внимание, что это глобальная переменная, поэтому эта форма не рекомендуется при работе с дескрипторами файлов, отличными от встроенных в Perl (например, STDOUT и STDIN). На самом деле, использование "голого слова" в качестве дескриптора файла является ошибкой, когда функцияbareword_filehandlesотключена. Эта функция отключена по умолчанию в области действияuse v5.36.0и более поздних версий.
- Другие соображения
-
- Автоматическое закрытие дескриптора файла
-
Дескриптор файла будет закрыт, когда его счетчик ссылок достигнет нуля. Если это лексически ограниченная переменная, объявленная с помощью
my, это обычно означает конец содержащей области видимости. Однако это автоматическое закрытие не проверяет наличие ошибок, поэтому лучше явно закрывать дескрипторы файлов, особенно те, которые используются для записи:close($handle) || warn "close failed: $!"; - Автоматическая очистка канала
-
Perl попытается очистить все файлы, открытые для вывода, перед любой операцией, которая может выполнить fork, но это может не поддерживаться на некоторых платформах (см. perlport). Для безопасности вам может потребоваться установить
$|($AUTOFLUSHв English) или вызвать методautoflushобъектаIO::Handleдля всех открытых дескрипторов.В системах, которые поддерживают флаг close-on-exec для файлов, этот флаг будет установлен для нового дескриптора файла, как определяется значением
$^F. См. "$^F" в perlvar.Закрытие любого дескриптора файла канала приводит к тому, что родительский процесс ожидает завершения дочернего процесса, затем возвращает значение состояния в
$?и${^CHILD_ERROR_NATIVE}. - Прямое и через ссылку присвоение дескрипторов файлов
-
Если FILEHANDLE — первый аргумент в вызове
open— является неопределённой скалярной переменной (или элементом массива или хэша), новый дескриптор файла создаётся автоматически, что означает, что переменная получает ссылку на только что выделенный анонимный дескриптор файла. В противном случае, если FILEHANDLE является выражением, его значение — это реальный дескриптор файла. (Это считается символической ссылкой, поэтомуuse strict "refs"не должен быть активным.) - Пробелы и специальные символы в аргументе имени файла
-
Имя файла, переданное в одно- и двухаргументные формы
open, будет иметь удалённые ведущие и хвостовые пробелы, а стандартные символы перенаправления будут учтены. Это свойство, известное как "магическое открытие", часто может быть использовано с успехом. Пользователь может указать имя файла "rsh cat file |", или вы можете изменить некоторые имена файлов по мере необходимости:$filename =~ s/(.*\.gz)\s*$/gzip -dc < $1|/; open(my $fh, $filename) or die "Can't open $filename: $!";Используйте форму с тремя аргументами для открытия файла с произвольными странными символами внутри него,
open(my $fh, "<", $file) || die "Can't open $file: $!";в противном случае необходимо защитить все ведущие и хвостовые пробелы:
$file =~ s#^(\s)#./$1#; open(my $fh, "< $file\0") || die "Can't open $file: $!";(это может не сработать в некоторых странных файловых системах). Следует сознательно выбирать между магической и трёхаргументной формой
open:open(my $in, $ARGV[0]) || die "Can't open $ARGV[0]: $!";позволит пользователю указать аргумент в форме
"rsh cat file |", но не будет работать с именем файла, которое случайно имеет хвостовой пробел, в то время какopen(my $in, "<", $ARGV[0]) || die "Can't open $ARGV[0]: $!";будет иметь прямо противоположные ограничения. (Однако некоторые оболочки поддерживают синтаксис
perl your_program.pl <( rsh cat file ), который создаёт имя файла, которое можно открыть нормально.) -
Вызов функции
openв стиле C -
Если вам нужен "настоящий" C open(2), то вы должны использовать функцию
sysopen, которая не включает такую магию (но использует другие режимы файлов, чем Perlopen, который соответствует C fopen(3)). Это ещё один способ защитить имена файлов от интерпретации. Например:use IO::Handle; sysopen(my $fh, $path, O_RDWR|O_CREAT|O_EXCL) or die "Can't open $path: $!"; $fh->autoflush(1); print $fh "stuff $$\n"; seek($fh, 0, 0); print "File contains: ", readline($fh);См.
seekдля некоторых подробностей о смешивании чтения и записи. - Проблемы с переносимостью
-
См. "open" в perlport.
-
- opendir DIRHANDLE,EXPR
-
Открывает директорию с именем EXPR для обработки с помощью
readdir,telldir,seekdir,rewinddirиclosedir. Возвращает true, если операция выполнена успешно. DIRHANDLE может быть выражением, значение которого может использоваться в качестве косвенного дескриптора каталога, обычно имя реального дескриптора каталога. Если DIRHANDLE — неопределённая скалярная переменная (или элемент массива или хэша), переменная получает ссылку на новый анонимный дескриптор каталога; то есть, она автовивифицируется. Дескрипторы каталогов — это те же объекты, что и дескрипторы файлов; объект ввода-вывода может быть открыт только как один из этих типов дескрипторов в одно и тоже время.См. пример в
readdir. - ord EXPR
- ord
-
Возвращает числовое значение первого символа EXPR. Если EXPR является пустой строкой, возвращает 0. Если EXPR опущено, использует
$_. (Обратите внимание на символ, а не байт.)Для обратного преобразования, см.
chr. См. perlunicode для получения более подробной информации об Unicode. - our VARLIST
- our TYPE VARLIST
- our VARLIST : ATTRS
- our TYPE VARLIST : ATTRS
-
ourсоздаёт лексический псевдоним для переменной пакета (т.е. глобальной) с тем же именем в текущем пакете для использования в текущей лексической области видимости.ourимеет те же правила области видимости, что иmyилиstate, что означает, что она действительна только в рамках лексической области видимости. В отличие отmyиstate, которые оба объявляют новые (лексические) переменные,ourсоздаёт только псевдоним для существующей переменной: переменной пакета с тем же именем.Это означает, что когда
use strict 'vars'в силе,ourпозволяет использовать переменную пакета без указания имени пакета, но только в лексической области видимости объявленияour. Это применяется немедленно — даже в рамках одного оператора.package Foo; use v5.36; # which implies "use strict;" $Foo::foo = 23; { our $foo; # alias to $Foo::foo print $foo; # prints 23 } print $Foo::foo; # prints 23 print $foo; # ERROR: requires explicit package nameЭто работает даже если переменная пакета не использовалась ранее, так как переменные пакета появляются при первом использовании.
package Foo; use v5.36; our $foo = 23; # just like $Foo::foo = 23 print $Foo::foo; # prints 23Поскольку переменная становится допустимой немедленно при
use strict 'vars', при условии, что в области видимости нет переменной с таким именем, вы можете снова обратиться к переменной пакета даже в рамках одного оператора.package Foo; use v5.36; my $foo = $foo; # error, undeclared $foo on right-hand side our $foo = $foo; # no errorsЕсли перечислено более одной переменной, список должен быть заключен в скобки.
our($bar, $baz);Объявление
ourобъявляет псевдоним для переменной пакета, который будет виден в пределах всей его лексической области видимости, даже через границы пакетов. Пакет, в котором находится переменная, определяется в момент объявления, а не в момент использования. Это означает, что действует следующее поведение:package Foo; our $bar; # declares $Foo::bar for rest of lexical scope $bar = 20; package Bar; print $bar; # prints 20, as it refers to $Foo::barРазрешено несколько объявлений
ourс одинаковым именем в одной лексической области видимости, если они находятся в разных пакетах. Если они находятся в одном пакете, Perl выведет предупреждения, если вы их запросили, так же как и для нескольких объявленийmy. В отличие от второго объявленияmy, которое связывает имя с новой переменной, второе объявлениеourв одном пакете, в одной области видимости, просто избыточно.use warnings; package Foo; our $bar; # declares $Foo::bar for rest of lexical scope $bar = 20; package Bar; our $bar = 30; # declares $Bar::bar for rest of lexical scope print $bar; # prints 30 our $bar; # emits warning but has no other effect print $bar; # still prints 30Объявление
ourтакже может иметь список атрибутов, связанных с ним.Точные семантика и интерфейс TYPE и ATTRS ещё разрабатываются. В настоящее время TYPE связан с использованием псевдонима fields, а атрибуты обрабатываются с помощью псевдонима attributes или, начиная с Perl 5.8.0, также через модуль Attribute::Handlers. Подробности см. в разделе "Переменные-только-для-пакета с помощью my()" в perlsub.
Обратите внимание, что с использованием списка в скобках,
undefможно использовать в качестве заглушки, например, для пропуска присвоения начальных значений:our ( undef, $min, $hour ) = localtime;ourотличается отuse vars, который позволяет использовать неопределённое имя только внутри затронутого пакета, но в разных областях видимости. - pack TEMPLATE,LIST
-
Принимает СПИСОК значений и преобразует его в строку, используя правила, заданные ШАБЛОНОМ. Результирующая строка — это конкатенация преобразованных значений. Обычно каждое преобразованное значение выглядит как его представление на уровне машины. Например, на 32-битных машинах целое число может быть представлено последовательностью из 4 байтов, которая в Perl будет представлена строкой длиной 4 символа.
См. perlpacktut для введения в эту функцию.
ШАБЛОН — это последовательность символов, определяющая порядок и тип значений, как следует:
a A string with arbitrary binary data, will be null padded. A A text (ASCII) string, will be space padded. Z A null-terminated (ASCIZ) string, will be null padded. b A bit string (ascending bit order inside each byte, like vec()). B A bit string (descending bit order inside each byte). h A hex string (low nybble first). H A hex string (high nybble first). c A signed char (8-bit) value. C An unsigned char (octet) value. W An unsigned char value (can be greater than 255). s A signed short (16-bit) value. S An unsigned short value. l A signed long (32-bit) value. L An unsigned long value. q A signed quad (64-bit) value. Q An unsigned quad value. (Quads are available only if your system supports 64-bit integer values _and_ if Perl has been compiled to support those. Raises an exception otherwise.) i A signed integer value. I An unsigned integer value. (This 'integer' is _at_least_ 32 bits wide. Its exact size depends on what a local C compiler calls 'int'.) n An unsigned short (16-bit) in "network" (big-endian) order. N An unsigned long (32-bit) in "network" (big-endian) order. v An unsigned short (16-bit) in "VAX" (little-endian) order. V An unsigned long (32-bit) in "VAX" (little-endian) order. j A Perl internal signed integer value (IV). J A Perl internal unsigned integer value (UV). f A single-precision float in native format. d A double-precision float in native format. F A Perl internal floating-point value (NV) in native format D A float of long-double precision in native format. (Long doubles are available only if your system supports long double values. Raises an exception otherwise. Note that there are different long double formats.) p A pointer to a null-terminated string. P A pointer to a structure (fixed-length string). u A uuencoded string. U A Unicode character number. Encodes to a character in char- acter mode and UTF-8 (or UTF-EBCDIC in EBCDIC platforms) in byte mode. Also on EBCDIC platforms, the character number will be the native EBCDIC value for character numbers below 256. This allows most programs using this feature to not have to care which type of platform they are running on. w A BER compressed integer (not an ASN.1 BER, see perlpacktut for details). Its bytes represent an unsigned integer in base 128, most significant digit first, with as few digits as possible. Bit eight (the high bit) is set on each byte except the last. x A null byte (a.k.a ASCII NUL, "\000", chr(0)) X Back up a byte. @ Null-fill or truncate to absolute position, counted from the start of the innermost ()-group. . Null-fill or truncate to absolute position specified by the value. ( Start of a ()-group.Один или несколько модификаторов ниже могут необязательно следовать за определёнными буквами в ШАБЛОНЕ (во второй колонке указаны буквы, для которых модификатор допустим):
! sSlLiI Forces native (short, long, int) sizes instead of fixed (16-/32-bit) sizes. ! xX Make x and X act as alignment commands. ! nNvV Treat integers as signed instead of unsigned. ! @. Specify position as byte offset in the internal representation of the packed string. Efficient but dangerous. > sSiIlLqQ Force big-endian byte-order on the type. jJfFdDpP (The "big end" touches the construct.) < sSiIlLqQ Force little-endian byte-order on the type. jJfFdDpP (The "little end" touches the construct.)Модификаторы
>и<также могут быть использованы в группах(), чтобы принудительно задать определённый порядок байтов для всех компонентов в этой группе, включая все её подгруппы.Применяются следующие правила:
-
Каждая буква может необязательно следовать за числом, указывающим количество повторений. Числовое количество повторений может быть необязательно заключено в скобки, как в
pack("C[80]", @arr). Количество повторений захватывает столько значений из СПИСКА, когда используется со всеми типами форматов, кромеa,A,Z,b,B,h,H,@,.,x,X, иP, где это имеет другое значение, описанное ниже. Передача*вместо числа означает использование оставшегося количества элементов, за исключением:-
@,x, иX, где это эквивалентно0. -
<.>, где это означает относительно начала строки.
-
u, где это эквивалентно 1 (или 45, что здесь эквивалентно).
Можно заменить числовое количество повторений буквой шаблона, заключённой в скобки, для использования длины упакованных байтов шаблона в скобках в качестве количества повторений.
Например, шаблон
x[L]пропускает столько байтов, сколько в упакованном длинном целом, а шаблон"$t X[$t] $t"распаковывает в два раза больше, чем $t (при переменном расширении) распаковывает. Если шаблон в скобках содержит команды выравнивания (например,x![d]), его длина в упакованном виде вычисляется так, как если бы начало шаблона имело максимальное возможное выравнивание.При использовании с
Z,*в качестве количества повторений гарантированно добавляет конечный нулевой байт, поэтому результирующая строка всегда на один байт длиннее длины байтов самого элемента.При использовании с
@, количество повторений представляет собой смещение от начала самой внутренней группы().При использовании с
., количество повторений определяет стартовую позицию для вычисления смещения значения следующим образом:-
Если количество повторений
0, оно относительно текущей позиции. -
Если количество повторений
*, смещение относительно начала упакованной строки. -
Если это целое число n, смещение относительно начала n-й внутренней группы
( ), или начала строки, если n больше уровня группы.
Количество повторений для
uинтерпретируется как максимальное количество байтов для кодирования на строке вывода, с 0, 1 и 2 заменёнными на 45. Количество повторений не должно быть больше 65. -
-
Типы
a,A, иZзахватывают только одно значение, но упаковывают его как строку длиной count, заполняя нулями или пробелами по мере необходимости. При распаковкеAудаляет хвостовые пробелы и нули,Zудаляет всё после первого нуля, иaвозвращает данные без удаления вообще.Если упаковываемое значение слишком длинное, результат обрезается. Если оно слишком длинное и указано явное количество,
Zупаковывает только$count-1байтов, после чего нулевой байт. Таким образомZвсегда упаковывает конечный нулевой байт, за исключением случая, когда количество равно 0. -
Аналогичным образом форматы
bиBупаковывают строку, длина которой указана в битах. Каждый такой формат генерирует 1 бит результата. За ними обычно следует количество повторений, какB8илиB64.Каждый результирующий бит основан на младшем бите соответствующего входного символа, т.е. на
ord($char)%2. В частности, символы"0"и"1"генерируют биты 0 и 1, как и символы"\000"и"\001".Начиная с начала входной строки, каждый 8-кортеж символов преобразуется в 1 символ вывода. С форматом
b, первый символ 8-кортежа определяет младший бит символа; с форматомB, он определяет старший бит символа.Если длина входной строки не делится на 8 без остатка, остаток упаковывается так, как если бы входная строка дополнялась нулевыми символами в конце. Аналогично, при распаковке "лишние" биты игнорируются.
Если входная строка длиннее, чем нужно, оставшиеся символы игнорируются.
*для количества повторений использует все символы входного поля. При распаковке биты преобразуются в строку из0и1. -
Форматы
hиHупаковывают строку, содержащую столько нибблов (4-битовых групп, представимых как шестнадцатеричные цифры,"0".."9""a".."f") long.Для каждого такого формата
packгенерирует 4 бита результата. С символами, не являющимися буквами, результат основан на 4 младших битах входного символа, т.е. наord($char)%16. В частности, символы"0"и"1"генерируют нибблы 0 и 1, как и байты"\000"и"\001". Для символов"a".."f"и"A".."F"результат совместим с обычными шестнадцатеричными цифрами, так что"a"и"A"оба генерируют ниббл0xA==10. Используйте только эти конкретные шестнадцатеричные символы с этим форматом.Начиная с начала шаблона до
pack, каждая пара символов преобразуется в 1 символ вывода. С форматомh, первый символ пары определяет младший ниббл выходного символа; с форматомH, он определяет старший ниббл.Если длина входной строки нечётная, она ведёт себя так, как если бы она дополнялась нулевым символом в конце. Аналогично, "лишние" нибблы игнорируются во время распаковки.
Если входная строка длиннее, чем нужно, дополнительные символы игнорируются.
*для количества повторений использует все символы входного поля. Дляunpackнибблы преобразуются в строку шестнадцатеричных цифр. -
Формат
pупаковывает указатель на завершающуюся нулём строку. Вы несете ответственность за обеспечение того, чтобы строка не была временным значением, так как это потенциально может быть освобождено до того, как вы успеете использовать упакованный результат. ФорматPупаковывает указатель на структуру указанного размера. Нулевой указатель создаётся, если соответствующее значение дляpилиPявляетсяundef; аналогично сunpack, где нулевой указатель распаковывается вundef.Если на вашей системе размер указателя необычный (то есть указатель ни так велик, как int, ни как long), может быть невозможно упаковать или распаковать указатели в порядке байтов big-endian или little-endian. Попытка сделать это вызывает исключение.
-
Символ шаблона
/позволяет упаковывать и распаковывать последовательность элементов, где упакованная структура содержит упакованное количество элементов, за которым следуют сами упакованные элементы. Это полезно, когда структура, которую вы распаковываете, закодировала размеры или количества повторений для некоторых своих полей внутри самой структуры в качестве отдельных полей.Для
packвы пишете длина-элемент/последовательность-элемент, и длина-элемент описывает, как упаковывается значение длины. Форматы, которые, скорее всего, будут полезны, — это форматы для упаковки целых чисел, такие какnдля строк Java,wдля ASN.1 или SNMP иNдля Sun XDR.Для
pack, последовательность-элемент может иметь количество повторений, в этом случае минимум из этого и количества доступных элементов используется в качестве аргумента для длина-элемент. Если у него нет количества повторений или он использует "*", используется количество доступных элементов.Для
unpackиспользуется внутренний стек целых аргументов, которые были распакованы до сих пор. Вы пишете/последовательность-элемент, и количество повторений получается путём извлечения последнего элемента из стека. Последовательность-элемент не должен иметь количество повторений.Если последовательность-элемент относится к типу строки (
"A","a", или"Z"), то длина-элемент — это длина строки, а не количество строк. При явном количестве повторений для упаковки упакованная строка корректируется до этой длины. Например:This code: gives this result: unpack("W/a", "\004Gurusamy") ("Guru") unpack("a3/A A*", "007 Bond J ") (" Bond", "J") unpack("a3 x2 /A A*", "007: Bond, J.") ("Bond, J", ".") pack("n/a* w/a","hello,","world") "\000\006hello,\005world" pack("a/W2", ord("a") .. ord("z")) "2ab"длина-элемент не возвращается явно из
unpack.Предоставление счётчика формату длина-элемент полезно только с
A,a, илиZ. Упаковка с длина-элементомaилиZможет ввести"\000"символы, которые Perl не считает допустимыми в числовых строках. -
Целочисленные типы
s,S,l, иLмогут следовать за модификатором!, чтобы указать родные типы коротких или длинных целых чисел. Как показано в примере выше, простойlозначает ровно 32 бита, хотя роднойlongпо мнению локального компилятора C может быть больше. Это в основном проблема на 64-битных платформах. Вы можете увидеть, оказывает ли!какое-либо влияние следующим образом:printf "format s is %d, s! is %d\n", length pack("s"), length pack("s!"); printf "format l is %d, l! is %d\n", length pack("l"), length pack("l!");i!иI!также разрешены, но только для полноты: они идентичныiиI.Фактические размеры (в байтах) родных типов коротких, целых, длинных и очень длинных целых чисел на платформе, где был построен Perl, также доступны из командной строки:
$ perl -V:{short,int,long{,long}}size shortsize='2'; intsize='4'; longsize='4'; longlongsize='8';или программно с помощью модуля
Config:use Config; print $Config{shortsize}, "\n"; print $Config{intsize}, "\n"; print $Config{longsize}, "\n"; print $Config{longlongsize}, "\n";$Config{longlongsize}не определено на системах без поддержки очень длинных целых.
-
-
Целочисленные форматы
s,S,i,I,l,L,j, иJизначально непереносимы между процессорами и операционными системами, потому что они подчиняются родной системе байтов и эндианности. Например, 4-байтовое целое число 0x12345678 (305419896 в десятичной системе) будет упорядочено в родном виде (расположено и обрабатывается регистрами ЦП) в байты как0x12 0x34 0x56 0x78 # big-endian 0x78 0x56 0x34 0x12 # little-endianВ основном, процессоры Intel и VAX являются little-endian, в то время как все остальные, включая Motorola m68k/88k, PPC, Sparc, HP PA, Power и Cray, являются big-endian. Alpha и MIPS могут быть любыми: Digital/Compaq использует (ну, использовали) их в режиме little-endian, но SGI/Cray использует их в режиме big-endian.
Названия big-endian и little-endian являются комическими отсылками к привычкам поедания яиц у лиллипутианцев из little-endian и blefuscudianцев из big-endian из классической сатиры Джонатана Свифта «Путешествия Гулливера». Это вошло в компьютерный жаргон через статью «О священных войнах и призыве к миру» Дэниела Коэна, USC/ISI IEN 137, 1 апреля 1980 года.
Некоторые системы могут иметь ещё более странные порядки байтов, такие как
0x56 0x78 0x12 0x34 0x34 0x12 0x78 0x56Их называют mid-endian, middle-endian, mixed-endian или просто странными.
Вы можете определить эндианность своей системы с помощью этой заклинания:
printf("%#02x ", $_) for unpack("W*", pack L=>0x12345678);Порядок байтов на платформе, где Perl был построен, также доступен через Config:
use Config; print "$Config{byteorder}\n";или с командной строки:
$ perl -V:byteorderПорядки байтов
"1234"и"12345678"являются little-endian;"4321"и"87654321"являются big-endian. Системы с многоархитектурными двоичными файлами будут иметь"ffff", что означает, что статическая информация не работает, необходимо использовать динамическое определение.Для переносимых упакованных целых чисел используйте форматы
n,N,v, иV, или используйте модификаторы>и<, описанные ниже. См. также perlport. -
Также числа с плавающей запятой имеют эндианность. Обычно (но не всегда) это совпадает с эндианностью целых чисел. Несмотря на то, что большинство платформ в наши дни используют двоичный формат IEEE 754, есть различия, особенно если задействованы длинные типы с плавающей запятой. Вы можете увидеть переменные
Configdoublekindиlongdblkind(такжеdoublesize,longdblsize) : значения «типа» — это перечисления, в отличие отbyteorder.С точки зрения переносимости лучшим вариантом, вероятно, является использование 64-битных чисел с плавающей запятой IEEE 754 с согласованной эндианностью. Другой вариант — формат
"%a")printf. -
Начиная с Perl 5.10.0, целочисленные и вещественные форматы, вместе с форматами
pиPи группами(), могут быть дополнены модификаторами эндианности>или<, чтобы соответственно установить порядок байтов big-endian или little-endian. Эти модификаторы особенно полезны, учитывая, чтоn,N,v, иVне охватывают знакомые целые числа, 64-битные целые числа или числа с плавающей запятой.Вот некоторые моменты, которые следует учитывать при использовании модификатора эндианности:
-
Обмен знаковыми целыми числами между различными платформами работает только тогда, когда все платформы хранят их в одном формате. Большинство платформ хранят знакомые целые числа в представлении в дополнительном коде, поэтому обычно это не проблема.
-
Модификаторы
>или<могут использоваться только для чисел с плавающей запятой на машинах big-endian или little-endian. В противном случае попытка их использования вызовет исключение. -
Принудительное использование big-endian или little-endian порядка байтов для чисел с плавающей запятой при обмене данными может сработать только если все платформы используют одно и то же двоичное представление, например, IEEE числа с плавающей запятой. Даже если все платформы используют IEEE, могут существовать небольшие различия. Возможность использования
>или<для чисел с плавающей запятой может быть полезной, но также и опасной, если вы точно не знаете, что делаете. Это не универсальный способ переносимого хранения чисел с плавающей запятой. -
При использовании
>или<в группе(), это влияет на все типы внутри группы, которые принимают модификаторы порядка байтов, включая все подгруппы. Для всех других типов это игнорируется. Вам не разрешается переопределять порядок байтов внутри группы, которая уже имеет суффикс модификатора порядка байтов.
-
-
Вещественные числа (числа с плавающей запятой и двойной точности) находятся только в родном формате машины. Из-за множественности форматов чисел с плавающей запятой и отсутствия стандартного «сетевого» представления для них не было создано никаких средств обмена. Это означает, что упакованные данные с плавающей запятой, записанные на одной машине, могут быть нечитаемыми на другой, даже если обе используют арифметику чисел с плавающей запятой IEEE (потому что порядок байтов представления в памяти не входит в спецификацию IEEE). См. также perlport.
Если вы точно знаете, что делаете, вы можете использовать модификаторы
>или<для принудительного задания порядка байтов big-endian или little-endian для чисел с плавающей запятой.Поскольку Perl использует числа двойной точности (или длинной двойной точности, если настроено) во всех числовых вычислениях, преобразование из числа двойной точности в число с одинарной точностью и обратно теряет точность, поэтому
unpack("f", pack("f", $foo)) вообще не будет равно $foo. -
Функции pack и unpack могут работать в двух режимах: режим символов (
C0режим), где упакованная строка обрабатывается по символам, и режим байтов UTF-8 (U0режим), где упакованная строка обрабатывается в её UTF-8-кодированной форме Юникода на основе байта за байтом. Режим символов является по умолчанию, если строка формата не начинается сU. Вы всегда можете переключить режим в процессе формирования с явнымC0илиU0в формате. Этот режим остаётся активным до следующего изменения режима или до конца группы(), к которой он (непосредственно) применяется.Использование
C0для получения символов Юникода при использованииU0для получения не-Юникод байтов не обязательно очевидно. Вероятно, только первое из этих действий вам нужно:$ perl -CS -E 'say "\x{3B1}\x{3C9}"' | perl -CS -ne 'printf "%v04X\n", $_ for unpack("C0A*", $_)' 03B1.03C9 $ perl -CS -E 'say "\x{3B1}\x{3C9}"' | perl -CS -ne 'printf "%v02X\n", $_ for unpack("U0A*", $_)' CE.B1.CF.89 $ perl -CS -E 'say "\x{3B1}\x{3C9}"' | perl -C0 -ne 'printf "%v02X\n", $_ for unpack("C0A*", $_)' CE.B1.CF.89 $ perl -CS -E 'say "\x{3B1}\x{3C9}"' | perl -C0 -ne 'printf "%v02X\n", $_ for unpack("U0A*", $_)' C3.8E.C2.B1.C3.8F.C2.89Эти примеры также иллюстрируют, что вы не должны пытаться использовать
pack/unpackкак замену модулю Encode. -
Вы сами должны выполнить выравнивание или заполнение, вставив, например, достаточно
"x"при упаковке.packиunpackне знают, откуда и куда идут символы, поэтому они обрабатывают свой вывод и ввод как плоские последовательности символов. -
Группа
()— это подшаблон, заключённый в скобки. Группа может принять счётчик повторений как постфикс, или дляunpack, также через символ шаблона/. В каждом повторении группы позиционирование с@начинается с нуля. Следовательно, результатомpack("@1A((@2A)@3A)", qw[X Y Z])является строка
"\0X\0\0YZ". -
xиXпринимают модификатор!, чтобы действовать как команды выравнивания: они перепрыгивают вперёд или назад к ближайшей позиции, выровненной по кратномуcountсимволов. Например, дляpackилиunpackструктуры C, такой какstruct { char c; /* one signed, 8-bit character */ double d; char cc[2]; }возможно, понадобится шаблон
c x![d] d c[2]. Это предполагает, что числа двойной точности должны быть выровнены по размеру числа двойной точности.Для команд выравнивания
countзначения 0 эквивалентноcountзначению 1; оба являются операциями-бездействиями. -
n,N,vиVпринимают модификатор!для представления знакомых 16-/32-битных целых чисел в big-/little-endian порядке. Это переносимо только тогда, когда все платформы, обменивающиеся упакованными данными, используют одно и то же двоичное представление для знакомых целых чисел; например, когда все платформы используют представление в дополнительном коде. -
Комментарии могут быть встроены в шаблон с помощью
#до конца строки. Пробелы могут отделять коды pack друг от друга, но модификаторы и счётчики повторений должны следовать непосредственно за ними. Разбиение сложных шаблонов на отдельные компоненты по строкам, должным образом аннотированные, может улучшить удобочитаемость и поддерживаемость форматов pack/unpack так же, как/xможет улучшить сложные совпадения шаблонов. -
Если шаблон требует больше аргументов, чем предоставлено в
pack,packпредполагает дополнительные аргументы"". Если шаблон требует меньше аргументов, чем предоставлено, дополнительные аргументы игнорируются. -
Попытка упаковки специальных значений чисел с плавающей запятой
InfиNaN(бесконечность, также отрицательная, и не число) в упакованные целочисленные значения (например,"L") является ошибкой. Причина в том, что просто нет никакого разумного сопоставления этих специальных значений с целыми числами.
Примеры:
$foo = pack("WWWW",65,66,67,68); # foo eq "ABCD" $foo = pack("W4",65,66,67,68); # same thing $foo = pack("W4",0x24b6,0x24b7,0x24b8,0x24b9); # same thing with Unicode circled letters. $foo = pack("U4",0x24b6,0x24b7,0x24b8,0x24b9); # same thing with Unicode circled letters. You don't get the # UTF-8 bytes because the U at the start of the format caused # a switch to U0-mode, so the UTF-8 bytes get joined into # characters $foo = pack("C0U4",0x24b6,0x24b7,0x24b8,0x24b9); # foo eq "\xe2\x92\xb6\xe2\x92\xb7\xe2\x92\xb8\xe2\x92\xb9" # This is the UTF-8 encoding of the string in the # previous example $foo = pack("ccxxcc",65,66,67,68); # foo eq "AB\0\0CD" # NOTE: The examples above featuring "W" and "c" are true # only on ASCII and ASCII-derived systems such as ISO Latin 1 # and UTF-8. On EBCDIC systems, the first example would be # $foo = pack("WWWW",193,194,195,196); $foo = pack("s2",1,2); # "\001\000\002\000" on little-endian # "\000\001\000\002" on big-endian $foo = pack("a4","abcd","x","y","z"); # "abcd" $foo = pack("aaaa","abcd","x","y","z"); # "axyz" $foo = pack("a14","abcdefg"); # "abcdefg\0\0\0\0\0\0\0" $foo = pack("i9pl", gmtime); # a real struct tm (on my system anyway) $utmp_template = "Z8 Z8 Z16 L"; $utmp = pack($utmp_template, @utmp1); # a struct utmp (BSDish) @utmp2 = unpack($utmp_template, $utmp); # "@utmp1" eq "@utmp2" sub bintodec { unpack("N", pack("B32", substr("0" x 32 . shift, -32))); } $foo = pack('sx2l', 12, 34); # short 12, two zero bytes padding, long 34 $bar = pack('s@4l', 12, 34); # short 12, zero fill to position 4, long 34 # $foo eq $bar $baz = pack('s.l', 12, 4, 34); # short 12, zero fill to position 4, long 34 $foo = pack('nN', 42, 4711); # pack big-endian 16- and 32-bit unsigned integers $foo = pack('S>L>', 42, 4711); # exactly the same $foo = pack('s<l<', -42, 4711); # pack little-endian 16- and 32-bit signed integers $foo = pack('(sl)<', -42, 4711); # exactly the sameТот же шаблон, как правило, также может быть использован в
unpack.-
- package NAMESPACE
- package NAMESPACE VERSION
- package NAMESPACE BLOCK
- package NAMESPACE VERSION BLOCK
-
Объявляет блок или остальную часть единицы компиляции как находящуюся в заданном пространстве имен. Областью действия объявления пакета является либо предоставленный код БЛОК, либо, в отсутствие БЛОКа, от самого объявления до конца текущей области видимости (включающего блок, файл или
eval). То есть, формы без БЛОКа действуют до конца текущей области видимости, подобно операторамmy,stateиour. Все неопределённые динамические идентификаторы в этой области видимости будут находиться в заданном пространстве имен, за исключением случаев переопределения другим объявлениемpackageили когда они являются специальными идентификаторами, попадающими вmain::, такие какSTDOUT,ARGV,ENV, и переменные пунктуации.Оператор пакета влияет только на динамические переменные, включая те, к которым вы применили
local, но не на переменные с лексической областью видимости, создаваемые с помощьюmy,stateилиour. Обычно это первое объявление в файле, включённом с помощьюrequireилиuse. Вы можете переключиться в пакет в нескольких местах, так как это определяет только таблицу символов по умолчанию, которую компилятор использует для остальной части этого блока. Вы можете ссылаться на идентификаторы в других пакетах, кроме текущего, предваряя идентификатор именем пакета и двойным двоеточием, как в$SomePack::varилиThatPack::INPUT_HANDLE. Если имя пакета опущено, предполагается пакетmain. То есть,$::sailэквивалентно$main::sail(а также$main'sail, что встречается в старом коде, в основном из Perl 4).Если указана VERSION,
packageустанавливает переменную$VERSIONв заданном пространстве имен в объект версии с предоставленной VERSION. VERSION должна быть номером версии в формате «строгого» стиля, как определено модулем version: положительное десятичное число (целое или дробное) без показателей степени или строка с точками и десятичными знаками, начинающаяся с символа 'v' и содержащая не менее трёх компонентов. Вы должны установить$VERSIONтолько один раз в пакете.См. "Пакеты" в perlmod для получения дополнительной информации о пакетах, модулях и классах. См. perlsub для других вопросов области видимости.
- __PACKAGE__
-
Специальный токен, возвращающий имя пакета, в котором он находится.
- pipe READHANDLE,WRITEHANDLE
-
Открывает пару соединённых каналов, как соответствующий системный вызов. Обратите внимание, что если вы организуете цикл связанных процессов через каналы, может произойти тупик, если вы не будете очень осторожны. Кроме того, обратите внимание, что каналы Perl используют буферизацию ввода-вывода, поэтому вам может потребоваться установить
$|для сброса WRITEHANDLE после каждой команды, в зависимости от приложения.Возвращает true при успехе.
См. IPC::Open2, IPC::Open3 и "Взаимодействие с другим процессом через двустороннюю связь" в perlipc для примеров таких действий.
На системах, поддерживающих флаг закрытия при выполнении (close-on-exec) для файлов, этот флаг устанавливается для всех вновь открытых дескрипторов файлов, чьи
filenoвыше текущего значения$^F(по умолчанию 2 дляSTDERR). См. "$^F" в perlvar. - pop ARRAY
- pop
-
Удаляет и возвращает последний элемент массива, укорачивая массив на один элемент.
my @arr = ('cat', 'dog', 'mouse'); my $item = pop(@arr); # 'mouse' # @arr is now ('cat', 'dog')Возвращает
undefесли массив пуст.Примечание:
popтакже может вернутьundefесли последний элемент массиваundef.my @arr = ('one', 'two', undef); my $item = pop(@arr); # undefЕсли ARRAY опущен,
popработает с массивом@ARGVв основной программе, но с массивом@_в подпрограммах.popбудет работать с массивом@ARGVвeval STRING,BEGIN {},INIT {},CHECK {}блоках.Начиная с Perl 5.14, была экспериментальная возможность
popпринимать скалярное выражение. Этот эксперимент признан неудачным и был удалён в Perl 5.24. - pos SCALAR
- pos
-
Возвращает смещение, с которого последний поиск
m//gостановился для заданной переменной ($_используется, если переменная не указана). Это смещение в символах, если не используется (не рекомендуется) прагмаuse bytes, в этом случае смещение в байтах. Обратите внимание, что 0 — допустимое смещение совпадения.undefуказывает на сброс позиции поиска (обычно из-за неудачи поиска, но также может быть, если поиск ещё не выполнялся со скаляром).posнапрямую обращается к месту, используемому движком регулярных выражений для хранения смещения, поэтому присвоениеposизменит это смещение, а также повлияет на\Gутверждение нулевой длины в регулярных выражениях. Оба эти эффекта применяются для следующего поиска, поэтому вы не можете повлиять на позицию с помощьюposво время текущего поиска, например, в(?{pos() = 5})илиs//pos() = 5/e.Установка
posтакже сбрасывает флаг совпадение нулевой длины, описанный в "Повторные шаблоны, совпадающие с подстрокой нулевой длины" в perlre.Так как неудачный поиск
m//gcне сбрасывает смещение, возвращаемоеpos, также не изменится в этом случае. См. perlre и perlop. - print FILEHANDLE LIST
- print FILEHANDLE
- print LIST
-
Выводит строку или список строк. Возвращает true при успехе. FILEHANDLE может быть скалярной переменной, содержащей имя или ссылку на файловый дескриптор, тем самым вводя один уровень косвенности. (ПРИМЕЧАНИЕ: если FILEHANDLE является переменной, и следующим токеном является терм, это может быть неправильно истолковано как оператор, если вы не вставите
+или не поставите скобки вокруг аргументов.) Если FILEHANDLE опущен, выводит в последний выбранный (см.select) выходной дескриптор. Если LIST опущен, выводит$_в текущий выбранный выходной дескриптор. Для использования FILEHANDLE только для вывода содержимого$_в него, вы должны использовать простой файловый дескриптор, как вFH, а не косвенный, как в$fh. Для изменения дескриптора вывода по умолчанию на что-то другое, чем STDOUT, используйте операцию select.Текущее значение
$,(если есть) выводится между каждым элементом списка. Текущее значение$\(если есть) выводится после вывода всего списка. Так как print принимает список, всё в списке вычисляется в контексте списка, включая подпрограммы, списки возвращений которых вы передаёте вprint. Будьте внимательны, не ставьте после print левую круглую скобку, если не хотите, чтобы соответствующая правая скобка завершала аргументы print; заключите все аргументы в скобки (или вставьте+, но это не выглядит так хорошо).Если вы храните дескрипторы в массиве или хеше, или в общем случае, когда вы используете любое выражение, более сложное, чем простой дескриптор или простая неиндексированная скалярная переменная для его получения, вам придётся использовать блок, возвращающий значение дескриптора, в этом случае LIST нельзя опустить:
print { $files[$i] } "stuff\n"; print { $OK ? *STDOUT : *STDERR } "stuff\n";Вывод в закрытую трубу или сокет вызовет сигнал SIGPIPE. См. perlipc для получения дополнительной информации о обработке сигналов.
- printf FILEHANDLE FORMAT, LIST
- printf FILEHANDLE
- printf FORMAT, LIST
- printf
-
Эквивалентно
print FILEHANDLE sprintf(FORMAT, LIST), за исключением того, что$\(разделитель записей вывода) не добавляется. Формат и список фактически анализируются как единый список. Первый аргумент списка будет интерпретирован как форматprintf. Это означает, чтоprintf(@_)будет использовать$_[0]в качестве формата. См. sprintf для объяснения аргумента формата. Еслиuse locale(включаяuse locale ':not_characters') активен иPOSIX::setlocaleбыл вызван, символ, используемый для разделителя десятичных знаков в форматированных числах с плавающей запятой, зависит от настройки локалиLC_NUMERIClocale. См. perllocale и POSIX.По историческим причинам, если вы опускаете список,
$_используется в качестве формата; чтобы использовать FILEHANDLE без списка, вы должны использовать простой файловый дескриптор, как вFH, а не косвенный, как в$fh. Однако это редко делает то, что вы хотите; если$_содержит форматирующие коды, они будут заменены пустой строкой, и будет выведено предупреждение, если включены предупреждения. Просто используйтеprint, если вы хотите вывести содержимое$_.Не попадайте в ловушку использования
printf, когда достаточно простогоprint.printболее эффективен и менее подвержен ошибкам. - prototype FUNCTION
- prototype
-
Возвращает прототип функции в виде строки (или
undef, если у функции нет прототипа). FUNCTION — это ссылка на функцию или её имя, прототип которой вы хотите получить. Если FUNCTION опущено, используется$_.Если FUNCTION — это строка, начинающаяся с
CORE::, остальная часть используется как имя встроенной функции Perl. Если аргументы встроенной функции не могут быть адекватно выражены прототипом (например,system),prototypeвозвращаетundef, так как встроенная функция не ведет себя как функция Perl. В противном случае возвращается строка, описывающая эквивалентный прототип. - push ARRAY,LIST
-
Добавляет один или несколько элементов в конец массива.
my @animals = ("cat"); push(@animals, "mouse"); # ("cat", "mouse") my @colors = ("red"); push(@colors, ("blue", "green")); # ("red", "blue", "green")Возвращает количество элементов в массиве после завершения
push.my $color_count = push(@colors, ("yellow", "purple")); say "There are $color_count colors in the updated array";Начиная с Perl 5.14, экспериментальная функция позволяла
pushпринимать скалярное выражение. Этот эксперимент признан неудачным и был удален в Perl 5.24. - q/STRING/
- qq/STRING/
- qw/STRING/
- qx/STRING/
-
Обобщенные кавычки. См. "Quote-Like Operators" в perlop.
- qr/STRING/
-
Регулярное выражение в кавычках. См. "Regexp Quote-Like Operators" в perlop.
- quotemeta EXPR
- quotemeta
-
Возвращает значение EXPR с обратной косой чертой для всех ASCII-символов, не являющихся "словными" символами. (То есть, все ASCII-символы, не соответствующие
/[A-Za-z_0-9]/, будут предваряться обратной косой чертой в возвращаемой строке независимо от настроек локали.) Это внутренняя функция, реализующая escape-последовательность\Qв строках с двойными кавычками. (См. ниже поведение с кодами символов, не входящих в ASCII.)Если EXPR опущено, используется
$_.quotemeta (и
\Q...\E) полезны при интерполяции строк в регулярные выражения, потому что по умолчанию интерполированная переменная будет рассматриваться как мини-регулярное выражение. Например:my $sentence = 'The quick brown fox jumped over the lazy dog'; my $substring = 'quick.*?fox'; $sentence =~ s{$substring}{big bad wolf};Приведет к тому, что
$sentenceстанет'The big bad wolf jumped over...'.С другой стороны:
my $sentence = 'The quick brown fox jumped over the lazy dog'; my $substring = 'quick.*?fox'; $sentence =~ s{\Q$substring\E}{big bad wolf};Или:
my $sentence = 'The quick brown fox jumped over the lazy dog'; my $substring = 'quick.*?fox'; my $quoted_substring = quotemeta($substring); $sentence =~ s{$quoted_substring}{big bad wolf};Оба варианта оставят предложение без изменений. Как правило, при приеме текстового ввода от пользователя
quotemetaили\Qдолжны использоваться.Следует быть осторожным, если вы помещаете литерные обратные косые черты (не внутри интерполированных переменных) между
\Qи\E, интерполяция обратных косых черт в стиле двойных кавычек может привести к непонятным результатам. Если вам необходимо использовать литерные обратные косые черты внутри\Q...\E, обратитесь к "Gory details of parsing quoted constructs" в perlop.Поскольку результат
"\Q STRING \E"содержит все метасимволы, помеченные, нет способа вставить литерный символ$или@внутри пары\Q\E. Если защищен\,$будет помечен, превратившись в"\\\$"; в противном случае он интерпретируется как начало интерполированного скаляра.В Perl v5.14 все символы, не входящие в ASCII, помечены в строках, не закодированных в UTF-8, но не помечены в строках UTF-8.
Начиная с Perl v5.16, Perl принял стратегию кодирования символов, не входящих в Unicode, кодирование символов ASCII осталось без изменений.
Также без изменений осталось кодирование строк, не закодированных в UTF-8, вне области действия
use feature 'unicode_strings', а именно — кодирование всех символов в диапазоне верхнего латинского 1. Это обеспечивает полную обратную совместимость со старыми программами, не использующими Unicode. (Обратите внимание, чтоunicode_stringsавтоматически включен в области действияuse v5.12или выше.)В области действия
use localeвсе символы, не входящие в ASCII Latin1, помечены, независимо от того, закодирована ли строка в UTF-8 или нет. Как упоминалось выше, локализация не влияет на кодирование символов в диапазоне ASCII. Это защищает от тех локализации, где символы, такие как"|"считаются "словными" символами.В противном случае Perl помещает символы, не входящие в ASCII, используя адаптацию из Unicode (см. https://www.unicode.org/reports/tr31/). Единственные символы, которые помечены, это те, которые имеют одно из свойств Unicode: Pattern_Syntax, Pattern_White_Space, White_Space, Default_Ignorable_Code_Point или General_Category=Control.
Из этих свойств важными являются Pattern_Syntax и Pattern_White_Space. Они были установлены Unicode именно для того, чтобы определить, какие символы в шаблоне регулярного выражения должны быть помечены. Ни один символ, который может быть частью идентификатора, не имеет этих свойств.
Perl обещает, что если мы когда-либо добавим метасимволы регулярных выражений в уже определенные дюжину (
\ | ( ) [ { ^ $ * + ? .), то мы будем использовать только те, которые имеют свойство Pattern_Syntax. Perl также обещает, что если мы когда-либо добавим символы, которые считаются пробелами в регулярных выражениях (сейчас это в основном касается/x), они все будут иметь свойство Pattern_White_Space.Unicode обещает, что набор кодовых точек, имеющих эти два свойства, никогда не изменится, поэтому то, что не помечено в v5.16, никогда не должно помещаться в будущих версиях Perl. (Не все кодовые точки, соответствующие Pattern_Syntax, получили назначенные символы; поэтому есть возможность роста, но они помечены независимо от назначения или отсутствия. Perl, разумеется, никогда не будет использовать незарезервированную кодовую точку в качестве фактического метасимвола.)
Помещение символов, имеющих другие 3 свойства, делается для повышения удобочитаемости регулярного выражения, а не потому, что они фактически должны быть помечены для целей регулярных выражений (символы со свойством White_Space, скорее всего, неотличимы на странице или экране от тех, которые имеют свойство Pattern_White_Space; и другие две группы свойств содержат непечатаемые символы).
- rand EXPR
- rand
-
Возвращает случайное дробное число, большее или равное
0и меньшее значения EXPR. (EXPR должно быть положительным.) Если EXPR опущено, используется значение1. В настоящее время значение EXPR со значением0также обрабатывается как специальное значение1(это было недокументировано до Perl 5.8.0 и может быть изменено в будущих версиях Perl). Автоматически вызываетsrand, еслиsrandеще не был вызван. См. такжеsrand.Примените
intк возвращаемому значениюrand, если вам нужны случайные целые числа вместо случайных дробных чисел. Например,int(rand(10))возвращает случайное целое число между
0и9, включительно.(Примечание: если ваша функция rand постоянно возвращает слишком большие или слишком малые числа, то ваша версия Perl, вероятно, была скомпилирована с неправильным числом RANDBITS.)
randне является криптографически безопасной. Вы не должны полагаться на нее в критически важных для безопасности ситуациях. На данный момент ряд сторонних модулей CPAN предлагают генераторы случайных чисел, которые, по мнению их авторов, являются криптографически безопасными, в том числе: Data::Entropy, Crypt::Random, Math::Random::Secure и Math::TrulyRandom. - read FILEHANDLE,SCALAR,LENGTH,OFFSET
- read FILEHANDLE,SCALAR,LENGTH
-
Попытка прочитать LENGTH символов данных в переменную SCALAR из указанного FILEHANDLE. Возвращает количество реально прочитанных символов,
0в конце файла или undef, если произошла ошибка (в последнем случае$!также установлено). SCALAR будет увеличен или уменьшен так, чтобы последний прочитанный символ был последним символом скаляра после чтения.Можно указать OFFSET для размещения прочитанных данных в определённом месте строки, а не в начале. Отрицательный OFFSET указывает размещение на столько символов назад от конца строки. Положительный OFFSET, превышающий длину SCALAR, приводит к дополнению строки до требуемого размера байтами
"\0"перед добавлением результата чтения.Вызов реализован с помощью внутренней функции Perl или вашей системы fread(3) через уровни PerlIO, применённые к файловому дескриптору. Чтобы получить истинный вызов системной функции read(2), см. sysread.
Обратите внимание на символы: в зависимости от состояния файлового дескриптора, считываются байты (8-битные) или символы. По умолчанию все файловые дескрипторы работают с байтами, но, например, если файловый дескриптор открыт с
:utf8слоем ввода-вывода (см.openи open прагму), ввод-вывод будет работать с закодированными в UTF-8 символами Unicode, а не с байтами. Аналогично для:encodingслоя: в этом случае можно прочитать практически любые символы. - readdir DIRHANDLE
-
Возвращает следующую запись каталога для каталога, открытого с помощью
opendir. Если используется в контексте списка, возвращает все остальные записи в каталоге. Если больше записей нет, возвращает значение undefined в скалярном контексте и пустой список в контексте списка.Если вы планируете использовать filetest для возвращаемых значений из
readdir, лучше префикснуть нужный каталог. В противном случае, из-за того, что мы не выполнилиchdirв нём, проверка файла будет некорректной.opendir(my $dh, $some_dir) || die "Can't opendir $some_dir: $!"; my @dots = grep { /^\./ && -f "$some_dir/$_" } readdir($dh); closedir $dh;Начиная с Perl 5.12, вы можете использовать простое
readdirв циклеwhile, что установит$_на каждой итерации. Если используется выражениеreaddirили явное присваивание выраженияreaddirскаляру в качестве условияwhile/for, то условие фактически проверяет определённость значения выражения, а не его обычное истинностное значение.opendir(my $dh, $some_dir) || die "Can't open $some_dir: $!"; while (readdir $dh) { print "$some_dir/$_\n"; } closedir $dh;Чтобы избежать путаницы у пользователей вашего кода, использующих более ранние версии Perl, с непонятными ошибками, поместите подобный код в начало файла, чтобы указать, что ваш код будет работать только с Perl последних версий:
use v5.12; # so readdir assigns to $_ in a lone while test - readline EXPR
- readline
-
Читает из файлового дескриптора, чья typeglob содержится в EXPR (или из
*ARGV, если EXPR не указан). В скалярном контексте каждый вызов читает и возвращает следующую строку до достижения конца файла, после чего последующий вызов возвращаетundef. В контексте списка читает до конца файла и возвращает список строк. Обратите внимание, что понятие «строка» здесь определяется тем, что вы определили с помощью$/(или$INPUT_RECORD_SEPARATORв English). См. "$/" в perlvar.Когда
$/установлено вundef, когдаreadlineнаходится в скалярном контексте (т. е. режим считывания всего файла), и когда читается пустой файл, он возвращает''первый раз, а затемundefв дальнейшем.Это внутренняя функция, реализующая оператор
<EXPR>, но вы можете использовать её напрямую. Оператор<EXPR>подробнее описан в "Операторы Ввода/Вывода" в perlop.my $line = <STDIN>; my $line = readline(STDIN); # same thingЕсли
readlineсталкивается с ошибкой операционной системы,$!будет установлено с соответствующим сообщением об ошибке. Это может быть полезно при проверке$!, когда вы читаете из файловых дескрипторов, которым не доверяете, таких как tty или сокет. Следующий пример использует операторную формуreadlineи завершает работу, если результат не определён.while ( ! eof($fh) ) { defined( $_ = readline $fh ) or die "readline failed: $!"; ... }Обратите внимание, что вы не можете обработать ошибки
readlineтаким способом с файловым дескрипторомARGV. В этом случае вам нужно открыть каждый элемент@ARGVсамостоятельно, так какeofобрабатываетARGVпо-другому.foreach my $arg (@ARGV) { open(my $fh, $arg) or warn "Can't open $arg: $!"; while ( ! eof($fh) ) { defined( $_ = readline $fh ) or die "readline failed for $arg: $!"; ... } }Как и оператор
<EXPR>, если выражениеreadlineиспользуется в качестве условия циклаwhileилиfor, то оно неявно присваивается$_. Если используется выражениеreadlineили явное присваивание выраженияreadlineскаляру в качестве условияwhile/for, то условие фактически проверяет определённость значения выражения, а не его обычное истинностное значение. - readlink EXPR
- readlink
-
Возвращает значение символической ссылки, если символические ссылки реализованы. Если нет, генерирует исключение. Если возникает системная ошибка, возвращает значение undefined и устанавливает
$!(errno). Если EXPR опущено, используется$_.Проблемы переносимости: "readlink" в perlport.
- readpipe EXPR
- readpipe
-
EXPR выполняется как системная команда. Собраный стандартный вывод команды возвращается. В скалярном контексте он возвращается как одна (возможно, многострочная) строка. В контексте списка возвращает список строк (как вы определили строки с
$/(или$INPUT_RECORD_SEPARATORв English)). Это внутренняя функция, реализующая операторqx/EXPR/, но вы можете использовать её напрямую. Операторqx/EXPR/подробнее описан в "qx/STRING/" в perlop. Если EXPR опущено, используется$_. - recv SOCKET,SCALAR,LENGTH,FLAGS
-
Принимает сообщение по сокету. Попытка принять LENGTH символов данных в переменную SCALAR из указанного файлового дескриптора SOCKET. SCALAR будет увеличен или уменьшен до длины, фактически прочитанной. Принимает те же флаги, что и системный вызов с таким же именем. Возвращает адрес отправителя, если протокол SOCKET это поддерживает; в противном случае возвращает пустую строку. При ошибке возвращает значение undefined. Этот вызов фактически реализован в терминах системного вызова recvfrom(2). Смотрите "UDP: Передача сообщений" в perlipc для примеров.
Обратите внимание, что если сокет был помечен как
:utf8,recvвыбросит исключение. Уровень:encoding(...)неявно вводит уровень:utf8. См.binmode. - redo LABEL
- redo EXPR
- redo
-
Команда
redoперезапускает блок цикла, не вычисляя условие заново. Блокcontinue, если есть, не выполняется. Если LABEL опущено, команда относится к самому внутреннему вложенному циклу. Формаredo EXPR, доступная начиная с Perl 5.18.0, позволяет вычислять имя метки во время выполнения, и в остальном идентичнаredo LABEL. Программы, которые хотят обмануть сами себя относительно того, что было введено, обычно используют эту команду:# a simpleminded Pascal comment stripper # (warning: assumes no { or } in strings) LINE: while (<STDIN>) { while (s|({.*}.*){.*}|$1 |) {} s|{.*}| |; if (s|{.*| |) { my $front = $_; while (<STDIN>) { if (/}/) { # end of comment? s|^|$front\{|; redo LINE; } } } print; }redoне может вернуть значение из блока, который обычно возвращает значение, например,eval {},sub {}, илиdo {}. Она выполнит свою работу по управлению потоком, что исключает любое возвращаемое значение. Не следует использовать для выхода из операцииgrepилиmap.Обратите внимание, что блок сам по себе семантически идентичен циклу, который выполняется один раз. Таким образом,
redoвнутри такого блока фактически превратит его в цикл.См. также
continueдля иллюстрации того, как работаютlast,nextиredo.В отличие от большинства именованных операторов, этот оператор имеет тот же приоритет, что и присваивание. Он также освобождён от правила, похожего на функцию, поэтому
redo ("foo")."bar"приведет к тому, что "bar" будет частью аргументаredo. - ref EXPR
- ref
-
Изучает значение EXPR, ожидая, что это ссылка, и возвращает строку, содержащую информацию о ссылке и типе целевого объекта. Если EXPR не указан, используется
$_.Если операнд не ссылка, возвращается пустая строка. Пустая строка возвращается только в этой ситуации.
refчасто полезно просто для проверки, является ли значение ссылкой, что можно сделать, сравнив результат с пустой строкой. Распространённая ошибка — использовать результатrefнепосредственно как логическое значение: это не сработает, так как0(ложное значение) может возвращаться для ссылки.Если операнд — ссылка на освящённый объект, то возвращается имя класса, в который освящён целевой объект.
refне интересует физический тип целевого объекта; освящение имеет приоритет над такими соображениями. Будьте осторожны, так как точное сравнение результатовrefс именем класса не является проверкой принадлежности к классу: члены класса также включают объекты, освящённые в подклассы, для которыхrefвернёт имя подкласса. Также будьте осторожны, так как имена классов могут совпадать с именами встроенных типов (описаны ниже).Если операнд — ссылка на неосвящённый объект, то возвращаемое значение указывает на тип объекта. Если неосвящённый целевой объект не скаляр, возвращаемое значение будет одной из строк
ARRAY,HASH,CODE,FORMAT, илиIO, указывающей только на вид объекта. Если неосвящённый целевой объект является скаляром, возвращаемое значение будет одной из строкSCALAR,VSTRING,REF,GLOB,LVALUE, илиREGEXP, в зависимости от типа значения, которое скаляр имеет в данный момент. Но обратите внимание, что скалярыqr//уже созданы с освящением, поэтомуref qr/.../, вероятно, вернётRegexp. Будьте осторожны, так как эти встроенные имена типов также могут использоваться как имена классов, поэтомуrefвозвращение одного из этих имён не однозначно указывает, что целевой объект относится к типу, обозначаемому этим именем.Неясность между встроенными именами типов и именами классов существенно ограничивает полезность
ref. Для получения однозначной информации используйтеScalar::Util::blessed()для получения информации об освящении иScalar::Util::reftype()для получения информации о физических типах. Используйте методisaдля проверки принадлежности к классу, но убедитесь в освящении перед выполнением вызова метода. В качестве альтернативы, операторisaможет проверять принадлежность к классу без предварительной проверки освящения. - rename OLDNAME,NEWNAME
-
Изменяет имя файла; существующий файл NEWNAME будет перезаписан. Возвращает true при успехе; при неудаче возвращает false и устанавливает
$!.Поведение этой функции сильно варьируется в зависимости от реализации на вашей системе. Например, она обычно не будет работать через границы файловой системы, даже если команда системы mv иногда компенсирует это. Другие ограничения включают возможность её работы с каталогами, открытыми файлами или существующими файлами. Подробности можно найти в perlport и в руководстве rename(2) или в соответствующей документации системы.
Для платформенно-независимой функции
moveобратитесь к модулю File::Copy.Проблемы переносимости: "rename" в perlport.
- require VERSION
- require EXPR
- require
-
Требует версию Perl, указанную в VERSION, или требует определённую семантику, указанную в EXPR, или же
$_, если EXPR не указан.VERSION может быть либо литералом, таким как v5.24.1, который будет сравниваться с
$^V(или$PERL_VERSIONв английском языке), либо числовым аргументом в формате 5.024001, который будет сравниваться с$]. Если VERSION больше, чем версия текущего интерпретатора Perl, возникает исключение. Сравните сuse, который может выполнить аналогичную проверку на этапе компиляции.Использование VERSION в виде числового аргумента в формате 5.024001 следует обычно избегать, так как это более устаревший и менее читаемый синтаксис по сравнению с v5.24.1. До perl 5.8.0 (выпущенного в 2002 году) более объёмный числовой формат был единственным поддерживаемым синтаксисом, поэтому вы можете увидеть его в более старом коде.
require v5.24.1; # run time version check require 5.24.1; # ditto require 5.024_001; # ditto; older syntax compatible with perl 5.6В противном случае,
requireтребует включения файла библиотеки, если он ещё не был включён. Файл включается с помощью механизма do-FILE, который по сути является лишь разновидностьюevalс оговоркой, что лексические переменные в вызывающей программе будут невидимы для включённого кода. Если бы это было реализовано в чистом Perl, его семантика была бы похожа на следующее:use Carp 'croak'; use version; sub require { my ($filename) = @_; if ( my $version = eval { version->parse($filename) } ) { if ( $version > $^V ) { my $vn = $version->normal; croak "Perl $vn required--this is only $^V, stopped"; } return 1; } if (exists $INC{$filename}) { return 1 if $INC{$filename}; croak "Compilation failed in require"; } local $INC; # this type of loop lets a hook overwrite $INC if they wish for($INC = 0; $INC < @INC; $INC++) { my $prefix = $INC[$INC]; if (!defined $prefix) { next; } if (ref $prefix) { #... do other stuff - see text below .... } # (see text below about possible appending of .pmc # suffix to $filename) my $realfilename = "$prefix/$filename"; next if ! -e $realfilename || -d _ || -b _; $INC{$filename} = $realfilename; my $result = do($realfilename); # but run in caller's namespace if (!defined $result) { $INC{$filename} = undef; croak $@ ? "$@Compilation failed in require" : "Can't locate $filename: $!\n"; } if (!$result) { delete $INC{$filename}; croak "$filename did not return true value"; } $! = 0; return $result; } croak "Can't locate $filename in \@INC ..."; }Обратите внимание, что файл не будет включён дважды с тем же именем.
Исторически файл должен возвращать true в качестве последней инструкции для обозначения успешного выполнения любого кода инициализации, поэтому обычно такой файл заканчивается
1;, если вы не уверены, что он вернёт true иначе. Но лучше просто добавить1;, на случай, если вы добавите больше инструкций. Начиная с версии 5.37.6, это требование может быть избегнуто, включив функцию 'module_true', которая по умолчанию включена в современных сборках. Таким образом, код сuse v5.37;больше не нуждается в решении этой проблемы. Смотрите feature для получения дополнительных подробностей. Обратите внимание, что это затрагивает единицу компиляции, в которой используется функция, и использование её до требования модуля не изменит поведение существующих модулей, которые её сами не используют.Если EXPR является именованным символом,
requireпредполагает расширение .pm и заменяет::на/в имени файла для вас, чтобы облегчить загрузку стандартных модулей. Этот способ загрузки модулей не рискует изменить ваше пространство имён, однако он автоматически инициализирует хранилище (stash) для требуемого модуля.Другими словами, если вы попробуете это:
require Foo::Bar; # a splendid barewordФункция require фактически будет искать файл Foo/Bar.pm в каталогах, указанных в массиве
@INC, и она автоматически инициализирует хранилище (stash)Foo::Bar::на этапе компиляции.Но если вы попробуете это:
my $class = 'Foo::Bar'; require $class; # $class is not a bareword #or require "Foo::Bar"; # not a bareword because of the ""Функция require будет искать файл Foo::Bar в массиве
@INCи сообщит об отсутствии Foo::Bar там. В этом случае вы можете сделать так:eval "require $class";или так
require "Foo/Bar.pm";Ни один из этих способов не будет автоматически инициализировать хранилища на этапе компиляции и будет иметь последствия только во время выполнения.
Теперь, когда вы понимаете, как
requireищет файлы с именованным аргументом, за кулисами происходит ещё одна функция. Перед тем какrequireищет расширение .pm, он сначала будет искать аналогичное имя файла с расширением .pmc. Если этот файл найден, он будет загружен вместо любого файла с расширением .pm. Это относится как к явномуrequire "Foo/Bar.pm";формату, так и кrequire Foo::Bar;формату.Вы также можете вставить крючки в механизм импорта, поместив Perl-ссылки на код или объекты непосредственно в массив
@INC. Существуют два типа крючков: фильтры INC и крючки INCDIR, и есть три формы представления крючка: ссылки на подпрограммы, ссылки на массивы и освящённые объекты.Ссылки на подпрограммы — это самый простой случай. Когда система включения проходит по
@INCи сталкивается с подпрограммой, если эта подпрограмма не освящена и не поддерживает крючок INCDIR, эта подпрограмма будет считаться крючком INC и будет вызвана с двумя параметрами: первым — ссылкой на себя, а вторым — именем файла для включения (например, Foo/Bar.pm). Подпрограмма должна вернуть либо ничего, либо список до четырёх значений в следующем порядке:-
Ссылка на скаляр, содержащий любой начальный исходный код для добавления перед файлом или результатом генератора.
-
Дескриптор файла, из которого будет считываться файл.
-
Ссылка на подпрограмму. Если нет дескриптора файла (предыдущий пункт), то ожидается, что эта подпрограмма сгенерирует одну строку исходного кода на вызов, запишет строку в
$_и вернёт 1, а затем в конце файла вернёт 0. Если есть дескриптор файла, подпрограмма будет вызвана для работы как простой фильтра исходного кода, со строкой, прочитанной из$_. Снова, возвращайте 1 для каждой корректной строки и 0 после возвращения всех строк. По историческим причинам подпрограмма получит бессмысленный аргумент (на самом деле всегда числовое значение ноль) как$_[0]. -
Необязательное состояние для подпрограммы. Состояние передаётся как
$_[1].
AUTOLOADне может быть использован для разрешения методаINCDIR,INCпроверяется первой, иAUTOLOADбы разрешил это.Если возвращается пустой список,
undefили ничего, что соответствует первым 3 значениям выше, тоrequireобращается к остальным элементам массива@INC. Обратите внимание, что этот дескриптор файла должен быть реальным дескриптором файла (строго говоря, typeglob или ссылка на typeglob, будь то освящённый или неосвящённый); связанные дескрипторы файлов будут игнорироваться, и обработка остановится на этом.Если крючок является объектом, он должен предоставить метод
INCилиINCDIR, который будет вызван как описано выше, первым параметром которого будет сам объект. Если он не предоставляет ни одного метода, и объект не является ссылкой на код, будет выброшено исключение, в противном случае он будет просто выполнен как неосвящённая ссылка на код. Обратите внимание, что имя метода необходимо указывать полностью, когда вы объявляете подпрограммуINC(в отличие от подпрограммыINCDIR), так как неопределённый символINCвсегда принудительно помещается в пакетmain. Вот типичная структура кода для крючкаINC:# In Foo.pm package Foo; sub new { ... } sub Foo::INC { my ($self, $filename) = @_; ... } # In the main program push @INC, Foo->new(...);Если крючок является ссылкой на массив, его первый элемент должен быть ссылкой на подпрограмму или объектом, как описано выше. Когда первым элементом является объект, поддерживающий метод
INCилиINCDIR, метод вызывается с объектом в качестве первого аргумента, запрошенным именем файла как вторым и ссылкой на массив крючка как третьим. Когда первым элементом является подпрограмма, она вызывается с массивом в качестве первого аргумента и именем файла как вторым, никакой третий параметр не передаётся. В обоих форматах вы можете изменить содержимое массива для предоставления состояния между вызовами или для любых других целей.Другими словами, вы можете написать:
push @INC, \&my_sub; sub my_sub { my ($coderef, $filename) = @_; # $coderef is \&my_sub ... }или:
push @INC, [ \&my_sub, $x, $y, ... ]; sub my_sub { my ($arrayref, $filename) = @_; # Retrieve $x, $y, ... my (undef, @parameters) = @$arrayref; ... }или:
push @INC, [ HookObj->new(), $x, $y, ... ]; sub HookObj::INC { my ($self, $filename, $arrayref)= @_; my (undef, @parameters) = @$arrayref; ... }Эти крючки также могут установить запись
%INCсоответствующую загруженным файлам. Смотрите "%INC" в perlvar. Если крючокINCне выполняет это, Perl установит запись%INCв саму ссылку на крючок.Крючок также может быть использован для перезаписи массива
@INC. Хотя это может показаться странным, в некоторых ситуациях это может быть очень полезно. Такие крючки обычно просто возвращают undef и не смешивают фильтрацию и изменения@INC. Хотя в более старых версиях Perl имело место изменение крючка@INCс проблемами и даже могло привести к сбою или утверждению, начиная с 5.37.7, логика стала гораздо более надёжной, и теперь крючок может управлять итерацией цикла, если он этого пожелает.Теперь есть возможность управлять итератором для обхода массива
@INC, который выполняется во время require. Переменная$INCбудет инициализирована с индексом текущего выполняемого крючка. После возврата крючка, следующая ячейка в массиве@INC, которая будет проверена, будет целочисленным преемником значения в$INC(или -1, если оно undef).Например, следующий код
push @INC, sub { splice @INC, $INC, 1; # remove this hook from @INC unshift @INC, sub { warn "A" }; undef $INC; # reset the $INC iterator so we # execute the newly installed sub # immediately. };установит подпрограмму в
@INC, которая при выполнении в качестве крючка (например, при require файла, который не существует), удалит себя из массива@INCи добавит новую подпрограмму в начало, которая будет выдавать предупреждение всякий раз, когда происходит операция require, требующая поиск@INC, и затем сразу же выполнит этот крючок.До версии 5.37.7 не было способа заставить Perl немедленно использовать недавно установленный крючок или проверить любые изменённые элементы в массиве
@INCслева от итератора, поэтому предупреждение генерировалось только при втором вызове require. В более новых версиях Perl наличие последней инструкции, которая делает$INCundef, заставит Perl перезапустить обход массива@INCс самого начала и немедленно выполнить новую установленную подпрограмму.Любое значение, которое
$INCсодержало, если таковое имелось, будет восстановлено в конце require. Любые изменения, внесённые в$INCв течение жизни крючка, будут отменены после выхода крючка, и его значение имеет смысл только сразу после выполнения крючка, поэтому установка значения$INCдо выполнения крючкаrequireне повлияет на выполнение require вообще.Начиная с 5.37.7 значения
@INCundef будут молча игнорироваться.Функция
require()трудно оборачивается должным образом. Многие модули обращаются к стеку, чтобы найти информацию о своём вызывающем объекте, а вставка новой кадра стека путём обертыванияrequire()часто ломает вещи. Тем не менее, это может быть очень полезно, чтобы иметь возможность выполнять действия до и послеrequire, например, для средств отслеживания, таких какDevel::TraceUse, или для измерения времени загрузки и потребления памяти графом require. Из-за трудностей с безопасным созданием оболочкиrequire()в 5.37.10 мы ввели новый механизм.Начиная с 5.37.10, перед любыми другими действиями
requireпроверяет, содержит ли${^HOOK}{require__before}ссылку на код, и если да, вызывается с именем файла загружаемого элемента. Крючок может изменить$_[0]для загрузки другого имени файла или выбросить фатальную ошибку, чтобы вызвать сбой require, который будет обрабатываться так, как если бы сам требуемый код выбросил исключение. -
Раздел
${^HOOK}{require__before}может вернуть ссылку на код, в этом случае ссылка на код будет выполнена (в eval с файлом в качестве параметра) после завершения require. Он будет выполнен независимо от того, как завершилась компиляция, и даже если require выбросил фатальную ошибку. Функция может обратиться к%INC, чтобы определить, произошла ли ошибка в require или нет. Например, следующий код выведет некоторые диагностические сообщения перед и после каждойrequireинструкции. Пример также включает логику для цепочки сигналов, чтобы несколько сигналов могли сотрудничать. Корректные обработчики${^HOOK}{require__before}всегда должны учитывать это.{ use Scalar::Util qw(reftype); my $old_hook = ${^HOOK}{require__before}; local ${^HOOK}{require__before} = sub { my ($name) = @_; my $old_hook_ret; $old_hook_ret = $old_hook->($name) if $old_hook; warn "Requiring: $name\n"; return sub { $old_hook_ret->() if ref($old_hook_ret) && reftype($old_hook_ret) eq "CODE"; warn sprintf "Finished requiring %s: %s\n", $name, $INC{$name} ? "loaded" :"failed"; }; }; require Whatever; }Этот обработчик выполняется для ВСЕХ
requireинструкций, в отличие отINCиINCDIRобработчиков, которые выполняются только для относительных имён файлов, и он выполняется первым до любого другого специального поведения внутри require. Обратите внимание, что начальный обработчик в${^HOOK}{require__before}*не* выполняется внутри eval, а выброс исключения остановит дальнейшую обработку, но обработчик после возврата может быть выполнен внутри eval, и любые исключения, которые он выбросит, будут молча проигнорированы. Это происходит потому, что он выполняется в рамках логики очистки области видимости, которая запускается после завершения require, и исключение в этот момент не остановит загрузку модуля и т. д.Существует аналогичный обработчик, который запускается после завершения require,
${^HOOK}{require__after}, который будет вызываться после завершения каждой инструкции require, либо через исключение, либо успешно. Он будет вызываться с именем файла последней выполненной инструкции require. Он выполняется в eval и никоим образом не повлияет на выполнение.Для ещё более мощной системы импорта, построенной вокруг
require, см.useи perlmod.- reset EXPR
- reset
-
Обычно используется в блоке
continueв конце цикла для очистки переменных и сбросаm?pattern?поисков, чтобы они снова работали. Выражение интерпретируется как список отдельных символов (разрешены тире для диапазонов). Все переменные (скаляры, массивы и хэши) в текущем пакете, начинающиеся с одного из этих символов, сбрасываются до своего первоначального состояния. Если выражение опущено, сбрасываются поиски с одним совпадением (m?pattern?) для повторного соответствия. Сбрасываются только переменные или поиски в текущем пакете. Всегда возвращает 1. Примеры:reset 'X'; # reset all X variables reset 'a-z'; # reset lower case variables reset; # just reset m?one-time? searchesСброс
"A-Z"не рекомендуется, так как вы удалите массивы@ARGVи@INCи хеш%ENV.Сбрасываются только переменные пакета; лексические переменные не затрагиваются, но они очищаются при выходе из области видимости, поэтому, вероятно, вы захотите использовать их вместо этого. См.
my. - return EXPR
- return
-
Возвращает значение из подпрограммы,
eval,do FILE, блокаsortили блока eval с регулярными выражениями (но не блокаgrep,mapилиdo BLOCK) со значением, указанным в EXPR. Вычисление EXPR может происходить в списковом, скалярном или пустом контексте в зависимости от того, как будет использоваться возвращаемое значение, и контекст может меняться от одного выполнения к другому (см.wantarray). Если EXPR не указан, возвращает пустой список в списковом контексте, неопределённое значение в скалярном контексте и (конечно) ничего в пустом контексте.(При отсутствии явного
return, подпрограмма,evalилиdo FILEавтоматически возвращает значение последнего вычисленного выражения.)В отличие от большинства именованных операторов, это также исключение из правила «выглядит как функция», поэтому
return ("foo")."bar"приведет к тому, что"bar"станет частью аргументаreturn. - reverse LIST
-
В списковом контексте возвращает список значений, содержащий элементы LIST в обратном порядке. В скалярном контексте конкатенирует элементы LIST и возвращает строковое значение со всеми символами в обратном порядке.
print join(", ", reverse "world", "Hello"); # Hello, world print scalar reverse "dlrow ,", "olleH"; # Hello, worldИспользуемый без аргументов в скалярном контексте,
reverseменяет местами$_.$_ = "dlrow ,olleH"; print reverse; # No output, list context print scalar reverse; # Hello, worldОбратите внимание, что изменение массива местами (как в
@a = reverse @a) сохранит несуществующие элементы, когда это возможно; то есть для неволшебных массивов или для привязанных массивов с методамиEXISTSиDELETE.Этот оператор также удобен для инвертирования хэша, хотя есть некоторые нюансы. Если значение дублируется в исходном хэше, только одно из них может быть представлено как ключ в инвертированном хэше. Кроме того, это требует разворачивания одного хэша и создания нового, что может занять некоторое время при большом хэше, например, из файла DBM.
my %by_name = reverse %by_address; # Invert the hash - rewinddir DIRHANDLE
-
Устанавливает текущую позицию в начало каталога для процедуры
readdirв DIRHANDLE.Проблемы с переносимостью: "rewinddir" in perlport.
- rindex STR,SUBSTR,POSITION
- rindex STR,SUBSTR
-
Работает так же, как
index, за исключением того, что возвращает позицию последнего вхождения SUBSTR в STR. Если указан POSITION, возвращает последнее вхождение, начиная с позиции или ранее. - rmdir FILENAME
- rmdir
-
Удаляет каталог, указанный в FILENAME, если этот каталог пустой. Если удаление успешно, возвращает true; в противном случае возвращает false и устанавливает
$!(errno). Если FILENAME опущено, используется$_.Для удаления древовидной структуры каталога рекурсивно (
rm -rfна Unix) см. функциюrmtreeмодуля File::Path. - s///
-
Оператор замены. См. "Regexp Quote-Like Operators" in perlop.
- say FILEHANDLE LIST
- say FILEHANDLE
- say LIST
- say
-
Точно так же, как
print, но неявно добавляет перевод строки в конце LIST вместо любого значения, которое$\мог бы иметь. Чтобы использовать FILEHANDLE без LIST для вывода содержимого$_в него, необходимо использовать простое имя файла, например,FH, а не косвенное, например,$fh.sayдоступен только если функция"say"включена или если она префиксCORE::. Функция"say"включается автоматически с инструкциейuse v5.10(или выше) в текущей области видимости. - scalar EXPR
-
Принуждает EXPR к интерпретации в скалярном контексте и возвращает значение EXPR.
my @counts = ( scalar @a, scalar @b, scalar @c );Нет эквивалентного оператора для принуждения выражения к интерпретации в списковом контексте, потому что на практике это никогда не требуется. Если вы действительно хотите это сделать, вы можете использовать конструкцию
@{[ (some expression) ]}, но обычно достаточно простого(some expression).Поскольку
scalarявляется унарным оператором, если вы случайно используете скобочный список для EXPR, это ведет себя как скалярное выражение с запятой, вычисляя все элементы, кроме последнего, в пустом контексте и возвращая последний вычисленный элемент в скалярном контексте. Это редко то, что вам нужно.Следующая единственная инструкция:
print uc(scalar(foo(), $bar)), $baz;является моральным эквивалентом этих двух:
foo(); print(uc($bar), $baz);См. perlop для получения дополнительной информации об унарных операторах и операторе запятой, и perldata для получения дополнительной информации об оценке хэша в скалярном контексте.
- seek FILEHANDLE,POSITION,WHENCE
-
Устанавливает позицию FILEHANDLE, как и вызов fseek(3) в C
stdio. FILEHANDLE может быть выражением, значение которого даёт имя файлового дескриптора. Значения для WHENCE являются0для установки новой позиции в байтах в POSITION;1для установки её в текущую позицию плюс POSITION; и2для установки её в EOF плюс POSITION, обычно отрицательное значение. Для WHENCE вы можете использовать константыSEEK_SET,SEEK_CUR, иSEEK_END(начало файла, текущая позиция, конец файла) из модуля Fcntl. Возвращает1при успехе, иначе false.Обратите внимание на акцент на байтах: даже если файловый дескриптор настроен на работу с символами (например, используя
:encoding(UTF-8)слой ввода-вывода), функции семействаseek,tellиsysseekиспользуют байтовые смещения, а не смещения символов, потому что поиск по смещению символов будет очень медленным в файле UTF-8.Если вы хотите позиционировать файл для
sysreadилиsyswrite, не используйтеseek, потому что буферизация делает её эффект на позицию чтения-записи файла непредсказуемым и непереносимым. Используйтеsysseekвместо этого.Из-за правил и строгих требований ANSI C на некоторых системах вам нужно выполнить поиск всякий раз, когда вы переключаетесь между чтением и записью. Среди прочего, это может привести к вызову clearerr(3) из stdio. Значение WHENCE
1(SEEK_CUR) полезно для того, чтобы не перемещать позицию файла:seek($fh, 0, 1);Это также полезно для приложений, эмулирующих
tail -f. После достижения EOF при чтении и последующего ожидания некоторое время, вам (вероятно) нужно вставить фиктивный вызовseekдля сброса состояния.seekне меняет позицию, но очищает состояние конца файла в дескрипторе, так что следующийreadline FILEзаставит Perl снова попытаться прочитать что-то. (Надеемся.)Если это не работает (некоторые реализации ввода-вывода особенно капризны), вам может потребоваться что-то вроде этого:
for (;;) { for ($curpos = tell($fh); $_ = readline($fh); $curpos = tell($fh)) { # search for some stuff and put it into files } sleep($for_a_while); seek($fh, $curpos, 0); } - seekdir DIRHANDLE,POS
-
Устанавливает текущую позицию для функции
readdirв DIRHANDLE. POS должно быть значением, возвращаемым функциейtelldir.seekdirтакже имеет те же предостережения о возможной уплотнении каталога, что и соответствующая системная библиотечная функция. - select FILEHANDLE
- select
-
Возвращает текущий выбранный файловый дескриптор. Если FILEHANDLE указан, устанавливает новый текущий стандартный файловый дескриптор для вывода. Это имеет два эффекта: во-первых,
write,printилиsayбез файлового дескриптора по умолчанию используют этот FILEHANDLE. Во-вторых, ссылки на переменные, относящиеся к выводу, будут относиться к этому выводу.Например, для установки формата верхней части формы для более чем одного канала вывода, вы можете сделать следующее:
select(REPORT1); $^ = 'report1_top'; select(REPORT2); $^ = 'report2_top';FILEHANDLE может быть выражением, значение которого даёт имя фактического файлового дескриптора. Таким образом:
my $oldfh = select(STDERR); $| = 1; select($oldfh);Некоторые программисты могут предпочесть рассматривать файловые дескрипторы как объекты с методами, предпочитая писать последний пример как:
STDERR->autoflush(1);(До версии Perl 5.14, вы должны
use IO::Handle;явно это сделать.)Хотя вы можете использовать
selectдля временного "захвата" выводаprintвот так:{ my $old_handle = select $new_handle; # This goes to $new_handle: print "ok 1\n"; ... select $old_handle; }Вам может быть проще локально изменить typeglob вместо этого:
{ local *STDOUT = $new_handle; print "ok 1\n"; ... }Эти два варианта не совсем эквивалентны, но последний может быть более понятным и восстановит STDOUT, если обернутый код завершится ошибкой. Разница в том, что в первом случае исходный STDOUT всё ещё доступен, если его явно использовать в
printоператоре (какprint STDOUT ...), тогда как во втором случае само значение файлового дескриптора STDOUT временно изменяется.Проблемы переносимости: "select" в perlport.
- select RBITS,WBITS,EBITS,TIMEOUT
-
Вызывает системный вызов select(2) с указанными битами маски, которые можно сконструировать с помощью
filenoиvec, примерно так:my $rin = my $win = my $ein = ''; vec($rin, fileno(STDIN), 1) = 1; vec($win, fileno(STDOUT), 1) = 1; $ein = $rin | $win;Если вы хотите выбрать множество файловых дескрипторов, вы можете написать подпрограмму, подобную этой:
sub fhbits { my @fhlist = @_; my $bits = ""; for my $fh (@fhlist) { vec($bits, fileno($fh), 1) = 1; } return $bits; } my $rin = fhbits(\*STDIN, $tty, $mysock);Обычный подход:
my ($nfound, $timeleft) = select(my $rout = $rin, my $wout = $win, my $eout = $ein, $timeout);или чтобы заблокировать до тех пор, пока что-то не станет готовым, сделайте вот так
my $nfound = select(my $rout = $rin, my $wout = $win, my $eout = $ein, undef);Большинство систем не утруждают себя возвратом чего-то полезного в
$timeleft, поэтому вызовselectв скалярном контексте просто возвращает$nfound.Любая из масок битов также может быть
undef. Время ожидания, если указано, выражено в секундах, которые могут быть дробными. Примечание: не все реализации способны вернуть$timeleft. Если нет, они всегда возвращают$timeleftравное указанному$timeout.Вы можете вызвать задержку на 250 миллисекунд следующим образом:
select(undef, undef, undef, 0.25);Обратите внимание, что перезапуск
selectпосле сигналов (например, SIGALRM) зависит от реализации. См. также perlport для примечаний о переносимостиselect.При ошибке
selectведёт себя так же, как select(2): возвращает-1и устанавливает$!.На некоторых Unix-системах select(2) может сообщать о сокете как "готовом к чтению", даже когда данные недоступны, и поэтому последующее
readбудет заблокировано. Этого можно избежать, если всегда использоватьO_NONBLOCKна сокете. См. select(2) и fcntl(2) для получения дополнительной информации.Стандартный модуль
IO::Selectпредоставляет более удобный интерфейс кselect, в основном потому, что он выполняет всю работу с маской битов за вас.ПРЕДУПРЕЖДЕНИЕ: Не следует пытаться смешивать буферизованный ввод-вывод (например,
readилиreadline) сselect, за исключением случаев, разрешённых POSIX, и даже тогда только на системах POSIX. Вместо этого необходимо использоватьsysread.Проблемы переносимости: "select" в perlport.
- semctl ID,SEMNUM,CMD,ARG
-
Вызывает системную функцию IPC semctl(2). Вероятно, вам нужно будет сказать
use IPC::SysV;сначала, чтобы получить правильные определения констант. Если CMD равен IPC_STAT или GETALL, то ARG должен быть переменной, которая будет содержать возвращаемую структуру semid_ds или массив значений семафоров. Возвращает, как и
ioctl: неопределённое значение при ошибке, "0 but true" для нуля или фактическое возвращаемое значение в противном случае. ARG должен состоять из вектора целых чисел типа short, которые можно создать с помощьюpack("s!",(0)x$nsem). Смотрите также "SysV IPC" в perlipc и документацию дляIPC::SysVиIPC::Semaphore.Проблемы переносимости: "semctl" в perlport.
- semget KEY,NSEMS,FLAGS
-
Вызывает системную функцию IPC semget(2). Возвращает идентификатор семафора или неопределённое значение при ошибке. Смотрите также "SysV IPC" в perlipc и документацию для
IPC::SysVиIPC::Semaphore.Проблемы переносимости: "semget" в perlport.
- semop KEY,OPSTRING
-
Вызывает системную функцию IPC semop(2) для операций с семафорами, таких как посылание сигналов и ожидание. OPSTRING должен быть упакованным массивом структур semop. Каждая структура semop может быть сгенерирована с помощью
pack("s!3", $semnum, $semop, $semflag). Длина OPSTRING подразумевает количество операций с семафорами. Возвращает true при успехе, false при ошибке. Например, следующий код ожидает на семафоре $semnum с идентификатором семафора $semid:my $semop = pack("s!3", $semnum, -1, 0); die "Semaphore trouble: $!\n" unless semop($semid, $semop);Для сигнализации семафора замените
-1на1. См. также "SysV IPC" в perlipc и документацию дляIPC::SysVиIPC::Semaphore.Проблемы переносимости: "semop" в perlport.
- send SOCKET,MSG,FLAGS,TO
- send SOCKET,MSG,FLAGS
-
Отправляет сообщение по сокету. Пытается отправить скаляр MSG в файловый дескриптор SOCKET. Принимает те же флаги, что и системный вызов с таким же именем. Для неустановленных сокетов необходимо указать место назначения, в этом случае происходит вызов sendto(2). Возвращает количество отправленных символов или неопределённое значение при ошибке. Системный вызов sendmsg(2) в настоящее время не реализован. См. "UDP: Передача сообщений" в perlipc для примеров.
Обратите внимание, что если сокет помечен как
:utf8,sendвызовет исключение. Слой:encoding(...)неявно добавляет слой:utf8. См.binmode. - setpgrp PID,PGRP
-
Устанавливает текущую группу процессов для указанного PID,
0для текущего процесса. Вызывает исключение при использовании на машине, которая не реализует POSIX setpgid(2) или BSD setpgrp(2). Если аргументы опущены, по умолчанию используется0,0. Обратите внимание, что BSD 4.2 версияsetpgrpне принимает никаких аргументов, поэтому толькоsetpgrp(0,0)является переносимой. См. такжеPOSIX::setsid().Проблемы с переносимостью: "setpgrp" в perlport.
- setpriority WHICH,WHO,PRIORITY
-
Устанавливает текущий приоритет для процесса, группы процессов или пользователя. (См. setpriority(2).) Вызывает исключение при использовании на машине, которая не реализует setpriority(2).
WHICHможет быть любым изPRIO_PROCESS,PRIO_PGRPилиPRIO_USERимпортированных из "RESOURCE CONSTANTS" в POSIX.Проблемы с переносимостью: "setpriority" в perlport.
- setsockopt SOCKET,LEVEL,OPTNAME,OPTVAL
-
Устанавливает запрашиваемый параметр сокета. Возвращает
undefпри ошибке. Используйте целочисленные константы, предоставленные модулемSocketдля LEVEL и OPNAME. Значения для LEVEL также можно получить из getprotobyname. OPTVAL может быть как упакованной строкой, так и целым числом. Целочисленный OPTVAL — это сокращение для pack("i", OPTVAL).Пример отключения алгоритма Nagle для сокета:
use Socket qw(IPPROTO_TCP TCP_NODELAY); setsockopt($socket, IPPROTO_TCP, TCP_NODELAY, 1);Проблемы с переносимостью: "setsockopt" в perlport.
- shift ARRAY
- shift
-
Удаляет и возвращает первый элемент массива. Массив уменьшается на один элемент, а все остальные элементы сдвигаются вниз.
my @arr = ('cat', 'dog'); my $item = shift(@arr); # 'cat' # @arr is now ('dog');Возвращает
undefесли массив пуст.Примечание:
shiftможет также вернутьundefесли первый элемент массиваundef.my @arr = (undef, 'two', 'three'); my $item = shift(@arr); # undefЕсли ARRAY опущен,
shiftработает с массивом@ARGVв основной программе и массивом@_в подпрограммах.shiftбудет работать с массивом@ARGVвeval STRING,BEGIN {},INIT {},CHECK {}блоках.Начиная с Perl 5.14, экспериментальная возможность позволяла
shiftпринимать скалярное выражение. Этот эксперимент признан неудачным и был удалён в Perl 5.24.См. также
unshift,pushиpop.shiftиunshiftделают то же самое для левого конца массива, чтоpopиpushделают для правого. - shmctl ID,CMD,ARG
-
Вызывает функцию System V IPC shmctl. Вероятно, вам сначала придётся сказать
use IPC::SysV;чтобы получить правильные определения констант. Если CMD —
IPC_STAT, то ARG должен быть переменной, которая будет содержать возвращаемую структуруshmid_ds. Возвраты подобны ioctl:undefпри ошибке; "0но true" для нуля; и фактическое возвращаемое значение в противном случае. См. также "SysV IPC" в perlipc и документацию дляIPC::SysV.Проблемы с переносимостью: "shmctl" в perlport.
- shmget KEY,SIZE,FLAGS
-
Вызывает функцию System V IPC shmget. Возвращает идентификатор сегмента общей памяти или
undefпри ошибке. См. также "SysV IPC" в perlipc и документацию дляIPC::SysV.Проблемы с переносимостью: "shmget" в perlport.
- shmread ID,VAR,POS,SIZE
- shmwrite ID,STRING,POS,SIZE
-
Читает или записывает сегмент общей памяти System V с идентификатором ID, начиная с позиции POS и размером SIZE, прикрепляясь к нему, копируя туда/оттуда и открепляясь от него. При чтении VAR должна быть переменная, которая будет содержать прочитанные данные. При записи, если STRING слишком длинный, используется только SIZE байт; если STRING слишком короткий, добавляются нули, чтобы заполнить SIZE байт. Возвращает true при успехе, false при ошибке.
shmreadделает переменную загрязнённой. См. также "SysV IPC" в perlipc и документацию дляIPC::SysVи модуляIPC::Shareableс CPAN.Проблемы с переносимостью: "shmread" в perlport и "shmwrite" в perlport.
- shutdown SOCKET,HOW
-
Завершает соединение сокета способом, указанным в HOW, который интерпретируется так же, как и в одноимённом системном вызове.
shutdown($socket, 0); # I/we have stopped reading data shutdown($socket, 1); # I/we have stopped writing data shutdown($socket, 2); # I/we have stopped using this socketЭто полезно с сокетами, когда вы хотите сказать другой стороне, что вы закончили запись, но ещё не закончили чтение, или наоборот. Это также более настойчивый способ закрытия, поскольку он также отключает дескриптор файла во всех разветвлённых копиях в других процессах.
Возвращает
1для успеха; при ошибке возвращаетundef, если первый аргумент не является допустимым дескриптором файла, или возвращает0и устанавливает$!для любой другой ошибки. - sin EXPR
- sin
-
Возвращает синус EXPR (выраженный в радианах). Если EXPR опущен, возвращает синус
$_.Для обратной операции синуса можно использовать функцию
Math::Trig::asin, или использовать это соотношение:sub asin { atan2($_[0], sqrt(1 - $_[0] * $_[0])) } - sleep EXPR
- sleep
-
Заставляет скрипт спать в течение (целого) EXPR секунд, или вечно, если аргумент не указан. Возвращает целое число секунд, которые фактически проспаны.
EXPR должен быть положительным целым числом. Если вызван с отрицательным целым числом,
sleepне спит, но вместо этого выводит предупреждение, устанавливает$!(errno) и возвращает ноль.Если вызван с нецелым числом, дробная часть игнорируется.
sleep 0разрешено, но вызов реализации платформы всё ещё происходит, с любыми побочными эффектами, которые могут быть.sleep 0поэтому не точно идентичен полному отсутствию сна.Может быть прерван, если процесс получает сигнал, такой как
SIGALRM.eval { local $SIG{ALRM} = sub { die "Alarm!\n" }; sleep; }; die $@ unless $@ eq "Alarm!\n";Вероятно, нельзя смешивать вызовы
alarmиsleep, так какsleepчасто реализуется с использованиемalarm.На некоторых старых системах он может спать до целой секунды меньше, чем вы запросили, в зависимости от того, как он считает секунды. Большинство современных систем всегда спят в течение полного запрошенного времени. Однако может показаться, что они спят дольше, потому что ваш процесс может не быть расписан сразу в многозадачной системе.
Для задержек с большей точностью, чем одна секунда, модуль Time::HiRes (с CPAN, и начиная с Perl 5.8, частью стандартного распределения) предоставляет
usleep. Вы также можете использовать четырёхаргументную версию Perlselectоставляя первые три аргумента неопределёнными, или вы можете использовать интерфейсsyscallдля доступа к setitimer(2), если ваша система её поддерживает. См. perlfaq8 для подробностей. - socket SOCKET,DOMAIN,TYPE,PROTOCOL
-
Открывает сокет указанного типа и прикрепляет его к дескриптору файла SOCKET. DOMAIN, TYPE и PROTOCOL задаются так же, как и в одноимённом системном вызове. Вам следует
use Socketсначала, чтобы получить правильные определения импортированные. См. примеры в "Sockets: Клиент/Серверное общение" в perlipc.На системах, которые поддерживают флаг close-on-exec для файлов, флаг будет установлен для вновь открытого дескриптора файла, как определяется значением
$^F. См. "$^F" в perlvar. - socketpair SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL
-
Создаёт неупомянутую пару сокетов в указанном домене, заданного типа. DOMAIN, TYPE и PROTOCOL задаются так же, как и в одноимённом системном вызове. Если не реализовано, вызывает исключение. Возвращает true при успехе.
На системах, которые поддерживают флаг close-on-exec для файлов, флаг будет установлен для вновь открытых дескрипторов файлов, как определяется значением
$^F. См. "$^F" в perlvar.Некоторые системы определяют
pipeв терминахsocketpair, в котором вызовpipe($rdr, $wtr)по сути:use Socket; socketpair(my $rdr, my $wtr, AF_UNIX, SOCK_STREAM, PF_UNSPEC); shutdown($rdr, 1); # no more writing for reader shutdown($wtr, 0); # no more reading for writerСм. perlipc для примера использования socketpair. Perl 5.8 и более поздние версии будут эмулировать socketpair с использованием IP-сокетов к localhost, если ваша система реализует сокеты, но не socketpair.
Проблемы с переносимостью: "socketpair" в perlport.
- sort SUBNAME LIST
- sort BLOCK LIST
- sort LIST
-
В контексте списка функция сортирует СПИСОК и возвращает отсортированный список значений. В скалярном контексте поведение
sortне определено.Если SUBNAME или BLOCK опущены,
sortсортируют список в стандартном порядке сравнения строк. Если указан SUBNAME, он задаёт имя подпрограммы, которая возвращает числовое значение меньше, равно или больше0, в зависимости от того, как нужно упорядочить элементы списка. (Операторы<=>иcmpочень полезны в таких подпрограммах.) SUBNAME может быть именем скалярной переменной (без индексов), в этом случае значение указывает имя (или ссылку на) фактическую подпрограмму, которую нужно использовать. Вместо SUBNAME можно указать BLOCK в виде анонимной, встроенной подпрограммы сортировки.Если прототип подпрограммы имеет вид
($$), сравниваемые элементы передаются по ссылке в@_, как и для обычной подпрограммы. Это медленнее, чем нетипизированные подпрограммы, где сравниваемые элементы передаются подпрограмме как глобальные переменные пакета$aи$b(см. пример ниже).Если подпрограмма является XSUB, сравниваемые элементы помещаются в стек, как обычно передаются аргументы XSUB.
$aи$bне устанавливаются.Сравниваемые значения всегда передаются по ссылке и не должны изменяться.
Также нельзя выйти из блока сортировки или подпрограммы, используя какие-либо операторы управления циклом, описанные в perlsyn, или с помощью
goto.Когда
use locale(но неuse locale ':not_characters') активен,sort LISTсортирует СПИСОК в соответствии с текущим языковым стандартом сортировки. См. perllocale.sortвозвращает ссылки на элементы исходного списка, аналогично тому, как индекс переменной цикла for ссылается на элементы списка. То есть, изменение элемента списка, возвращённогоsort(например, вforeach,mapилиgrep) фактически изменяет элемент в исходном списке. Этого обычно следует избегать при написании понятного кода.Исторически, Perl по-разному обрабатывал стабильность сортировки по умолчанию. Если стабильность важна, её можно явно контролировать, используя прагму sort.
Примеры:
# sort lexically my @articles = sort @files; # same thing, but with explicit sort routine my @articles = sort {$a cmp $b} @files; # now case-insensitively my @articles = sort {fc($a) cmp fc($b)} @files; # same thing in reversed order my @articles = sort {$b cmp $a} @files; # sort numerically ascending my @articles = sort {$a <=> $b} @files; # sort numerically descending my @articles = sort {$b <=> $a} @files; # this sorts the %age hash by value instead of key # using an in-line function my @eldest = sort { $age{$b} <=> $age{$a} } keys %age; # sort using explicit subroutine name sub byage { $age{$a} <=> $age{$b}; # presuming numeric } my @sortedclass = sort byage @class; sub backwards { $b cmp $a } my @harry = qw(dog cat x Cain Abel); my @george = qw(gone chased yz Punished Axed); print sort @harry; # prints AbelCaincatdogx print sort backwards @harry; # prints xdogcatCainAbel print sort @george, 'to', @harry; # prints AbelAxedCainPunishedcatchaseddoggonetoxyz # inefficiently sort by descending numeric compare using # the first integer after the first = sign, or the # whole record case-insensitively otherwise my @new = sort { ($b =~ /=(\d+)/)[0] <=> ($a =~ /=(\d+)/)[0] || fc($a) cmp fc($b) } @old; # same thing, but much more efficiently; # we'll build auxiliary indices instead # for speed my (@nums, @caps); for (@old) { push @nums, ( /=(\d+)/ ? $1 : undef ); push @caps, fc($_); } my @new = @old[ sort { $nums[$b] <=> $nums[$a] || $caps[$a] cmp $caps[$b] } 0..$#old ]; # same thing, but without any temps my @new = map { $_->[0] } sort { $b->[1] <=> $a->[1] || $a->[2] cmp $b->[2] } map { [$_, /=(\d+)/, fc($_)] } @old; # using a prototype allows you to use any comparison subroutine # as a sort subroutine (including other package's subroutines) package Other; sub backwards ($$) { $_[1] cmp $_[0]; } # $a and $b are # not set here package main; my @new = sort Other::backwards @old; ## using a prototype with function signature use feature 'signatures'; sub function_with_signature :prototype($$) ($one, $two) { return $one <=> $two } my @new = sort function_with_signature @old; # guarantee stability use sort 'stable'; my @new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;Предупреждение: требуется соблюдение синтаксических правил при сортировке списка, возвращаемого функцией. Если вы хотите отсортировать список, возвращаемый вызовом функции
find_records(@key), вы можете использовать:my @contact = sort { $a cmp $b } find_records @key; my @contact = sort +find_records(@key); my @contact = sort &find_records(@key); my @contact = sort(find_records(@key));Если вместо этого вы хотите отсортировать массив
@keyс помощью подпрограммы сравненияfind_records(), вы можете использовать:my @contact = sort { find_records() } @key; my @contact = sort find_records(@key); my @contact = sort(find_records @key); my @contact = sort(find_records (@key));$aи$bустанавливаются как глобальные переменные пакета, в котором вызывается sort(). Это означает, что$main::aи$main::b(или$::aи$::b) в пакетеmain,$FooPack::aи$FooPack::bв пакетеFooPackи т.д. Если блок сортировки находится в области видимости объявленияmyилиstateдля$aи/или$b, вы обязаны указывать полные имена переменных в блоке сортировки:package main; my $a = "C"; # DANGER, Will Robinson, DANGER !!! print sort { $a cmp $b } qw(A C E G B D F H); # WRONG sub badlexi { $a cmp $b } print sort badlexi qw(A C E G B D F H); # WRONG # the above prints BACFEDGH or some other incorrect ordering print sort { $::a cmp $::b } qw(A C E G B D F H); # OK print sort { our $a cmp our $b } qw(A C E G B D F H); # also OK print sort { our ($a, $b); $a cmp $b } qw(A C E G B D F H); # also OK sub lexi { our $a cmp our $b } print sort lexi qw(A C E G B D F H); # also OK # the above print ABCDEFGHПри надлежащем уходе вы можете смешивать пакетные и мои (или state)
$aи/или$b:my $a = { tiny => -2, small => -1, normal => 0, big => 1, huge => 2 }; say sort { $a->{our $a} <=> $a->{our $b} } qw{ huge normal tiny small big}; # prints tinysmallnormalbighuge$aи$bнеявно являются локальными для выполнения sort() и восстанавливают свои предыдущие значения после завершения сортировки.Подпрограммы сортировки, написанные с использованием
$aи$b, привязаны к вызывающему пакету. Возможно, но с ограниченным интересом, определить их в другом пакете, так как подпрограмма всё равно должна ссылаться на глобальные переменные пакета вызывающего$aи$b:package Foo; sub lexi { $Bar::a cmp $Bar::b } package Bar; ... sort Foo::lexi ...Используйте типизированные версии (см. выше) для более универсального альтернативного варианта.
Функция сравнения должна иметь корректное поведение. Если она возвращает противоречивые результаты (иногда говорит, что
$x[1]меньше$x[2], а иногда наоборот, например), результаты не определены.Поскольку
<=>возвращаетundef, когда один из операндов —NaN(не число), будьте осторожны при сортировке с помощью функции сравнения, такой как$a <=> $b, любых списков, которые могут содержатьNaN. Следующий пример использует это, чтобы исключить любыеNaNиз входного списка.my @result = sort { $a <=> $b } grep { $_ == $_ } @input;В этой версии perl функция
sortреализована с помощью алгоритма слияния. - splice ARRAY,OFFSET,LENGTH,LIST
- splice ARRAY,OFFSET,LENGTH
- splice ARRAY,OFFSET
- splice ARRAY
-
Удаляет элементы, обозначенные OFFSET и LENGTH, из массива, а затем заменяет их элементами LIST, если таковые имеются. В контексте списка возвращает удалённые элементы из массива. В скалярном контексте возвращает последний удалённый элемент или
undef, если элементы не удалены. Массив увеличивается или уменьшается по мере необходимости. Если OFFSET отрицательно, он отсчитывается от конца массива. Если LENGTH опущено, удаляются все элементы с OFFSET и далее. Если LENGTH отрицательно, удаляются элементы с OFFSET и далее, за исключением -LENGTH элементов в конце массива. Если оба OFFSET и LENGTH опущены, удаляются все элементы. Если OFFSET выходит за пределы массива и LENGTH был предоставлен, Perl выдает предупреждение и выполняет срез в конце массива.Следующие эквивалентности выполняются (предполагая
$#a >= $i):push(@a,$x,$y) splice(@a,@a,0,$x,$y) pop(@a) splice(@a,-1) shift(@a) splice(@a,0,1) unshift(@a,$x,$y) splice(@a,0,0,$x,$y) $a[$i] = $y splice(@a,$i,1,$y)spliceможет использоваться, например, для реализации обработки очереди n-элементов:sub nary_print { my $n = shift; while (my @next_n = splice @_, 0, $n) { say join q{ -- }, @next_n; } } nary_print(3, qw(a b c d e f g h)); # prints: # a -- b -- c # d -- e -- f # g -- hНачиная с Perl 5.14, экспериментальная функция позволила
spliceпринимать скалярное выражение. Этот эксперимент был признан неудачным и был удалён в Perl 5.24. - split /PATTERN/,EXPR,LIMIT
- split /PATTERN/,EXPR
- split /PATTERN/
- split
-
Разделяет строку EXPR на список строк и возвращает список в контексте списка или размер списка в скалярном контексте. (До Perl 5.11 это также перезаписывало
@_списком в пустом и скалярном контексте. Если вы ориентируетесь на старые версии Perl, будьте осторожны.)Если указан только PATTERN, EXPR по умолчанию устанавливается в
$_.Любое в EXPR, что соответствует PATTERN, считается разделителем, который разделяет EXPR на подстроки (называемые "полями"), которые не включают разделитель. Обратите внимание, что разделитель может быть длиннее одного символа или даже не содержать символов (пустая строка, которая является совпадением нулевой ширины).
PATTERN необязательно должен быть константой; может использоваться выражение для указания шаблона, который меняется во время выполнения.
Если PATTERN соответствует пустой строке, EXPR разделяется в позиции совпадения (между символами). Например, следующее:
my @x = split(/b/, "abc"); # ("a", "c")использует
bв'abc'в качестве разделителя, чтобы получить список ("a", "c"). Однако, это:my @x = split(//, "abc"); # ("a", "b", "c")использует совпадения пустых строк как разделители; таким образом, пустую строку можно использовать для разделения EXPR на список его составляющих символов.
В качестве специального случая для
splitпустой шаблон, указанный в синтаксисе оператора сопоставления (//) специально соответствует пустой строке, что противоречит его обычному толкованию как последнему успешному совпадению.Если PATTERN равен
/^/, то он обрабатывается так, как будто использует модификатор многострочности (/^/m), так как в противном случае он мало пригоден./mи любые другие модификаторы шаблонов, допустимые дляqr(подробно описанные в "qr/STRING/msixpodualn" в perlop) могут быть явно указаны.В качестве еще одного специального случая
splitэмулирует стандартное поведение командной утилиты awk, когда PATTERN отсутствует или является строкой, состоящей из одного пробела (например,' 'или"\x20", но не, например,/ /). В этом случае любые начальные пробелы в EXPR удаляются перед разделением, а PATTERN вместо этого обрабатывается так, как будто он был/\s+/; в частности, это означает, что любые последовательные пробелы (а не только один пробел) используются в качестве разделителей.my @x = split(" ", " Quick brown fox\n"); # ("Quick", "brown", "fox") my @x = split(" ", "RED\tGREEN\tBLUE"); # ("RED", "GREEN", "BLUE")Использование split таким образом очень похоже на то, как работает
qw//.Однако, это специальное обращение можно избежать, указав шаблон
/ /вместо строки" ", тем самым разрешая в качестве разделителя только один пробел. В более ранних версиях Perl этот специальный случай был ограничен использованием простого" "в качестве аргумента шаблона для split; в Perl 5.18.0 и более поздних версиях этот специальный случай срабатывает для любого выражения, которое вычисляется в простую строку" ".Начиная с Perl 5.28, это специальное разбиение по пробелам работает как ожидается в рамках
"use feature 'unicode_strings'". В предыдущих версиях и вне области действия этой функции он демонстрирует "Ошибка Unicode" в perlunicode: символы, которые являются пробелами в соответствии с правилами Unicode, но не в соответствии с правилами ASCII, могут обрабатываться как часть полей, а не как разделители полей, в зависимости от внутреннего кодирования строки.Если PATTERN опущен, он по умолчанию устанавливается в один пробел,
" ", вызывая описанную выше эмуляцию awk.Если LIMIT указан и положителен, он представляет максимальное количество полей, на которые может быть разделен EXPR; другими словами, LIMIT на единицу больше максимального числа разбиений EXPR. Таким образом, значение LIMIT
1означает, что EXPR может быть разделен максимум ноль раз, что дает максимум одно поле (именно, все значение EXPR). Например:my @x = split(//, "abc", 1); # ("abc") my @x = split(//, "abc", 2); # ("a", "bc") my @x = split(//, "abc", 3); # ("a", "b", "c") my @x = split(//, "abc", 4); # ("a", "b", "c")Если LIMIT отрицательный, он обрабатывается так, как будто он был произвольно большим; производится как можно больше полей.
Если LIMIT опущен (или равен нулю), то он обычно обрабатывается так, как будто он был отрицательным, но с исключением, что trailing пустые поля удаляются (leading пустые поля всегда сохраняются); если все поля пустые, то все поля считаются trailing (и удаляются в этом случае). Таким образом, следующее:
my @x = split(/,/, "a,b,c,,,"); # ("a", "b", "c")возвращает только список из трех элементов.
my @x = split(/,/, "a,b,c,,,", -1); # ("a", "b", "c", "", "", "")возвращает список из шести элементов.
В приложениях, зависящих от времени, стоит избегать разделения на большее количество полей, чем необходимо. Таким образом, при присваивании списку, если LIMIT опущен (или равен нулю), то LIMIT рассматривается как на единицу больше, чем количество переменных в списке; для следующего, LIMIT неявно равен 3:
my ($login, $passwd) = split(/:/);Обратите внимание, что разделение EXPR, равного пустой строке, всегда приводит к нулю полей, независимо от указанного LIMIT.
Пустое leading поле создается, когда есть совпадение положительной ширины в начале EXPR. Например:
my @x = split(/ /, " abc"); # ("", "abc")разделяется на два элемента. Однако, совпадение нулевой ширины в начале EXPR никогда не создает пустое поле, поэтому:
my @x = split(//, " abc"); # (" ", "a", "b", "c")разделяется на четыре элемента вместо пяти.
Пустое trailing поле, с другой стороны, создается, когда есть совпадение в конце EXPR, независимо от длины совпадения (конечно, если не задан ненулевой LIMIT, такие поля удаляются, как в последнем примере). Таким образом:
my @x = split(//, " abc", -1); # (" ", "a", "b", "c", "")Если PATTERN содержит группы захвата, то для каждого разделителя создается дополнительное поле для каждой подстроки, захваченной группой (в порядке указания групп, как в обратных ссылках); если какая-либо группа не соответствует, то она захватывает значение
undefвместо подстроки. Также обратите внимание, что любое такое дополнительное поле создается всякий раз, когда есть разделитель (то есть, когда происходит разделение), и такое дополнительное поле не учитывается в LIMIT. Рассмотрим следующие выражения, вычисленные в контексте списка (каждый возвращаемый список представлен в соответствующем комментарии):my @x = split(/-|,/ , "1-10,20", 3); # ("1", "10", "20") my @x = split(/(-|,)/ , "1-10,20", 3); # ("1", "-", "10", ",", "20") my @x = split(/-|(,)/ , "1-10,20", 3); # ("1", undef, "10", ",", "20") my @x = split(/(-)|,/ , "1-10,20", 3); # ("1", "-", "10", undef, "20") my @x = split(/(-)|(,)/, "1-10,20", 3); # ("1", "-", undef, "10", undef, ",", "20") - sprintf FORMAT, LIST
-
Возвращает строку, отформатированную по обычным
printfсоглашениям функции C-библиотекиsprintf. Более подробную информацию см. ниже, а также в sprintf(3) или printf(3) на вашей системе для объяснения общих принципов.Например:
# Format number with up to 8 leading zeroes my $result = sprintf("%08d", $number); # Round number to 3 digits after decimal point my $rounded = sprintf("%.3f", $number);Perl выполняет собственную
sprintfформатировку: она эмулирует функцию C sprintf(3), но не использует её, кроме как для чисел с плавающей точкой, и даже тогда только стандартные модификаторы. Нестандартные расширения в вашей локальной sprintf(3) поэтому недоступны из Perl.В отличие от
printf,sprintfне делает того, что вы, вероятно, имеете в виду, передавая ей массив в качестве первого аргумента. Массив передаётся в скалярном контексте, и вместо использования нулевого элемента массива в качестве формата, Perl использует количество элементов в массиве в качестве формата, что почти никогда не бывает полезно.Perl's
sprintfдопускает следующие общеизвестные преобразования:%% a percent sign %c a character with the given number %s a string %d a signed integer, in decimal %u an unsigned integer, in decimal %o an unsigned integer, in octal %x an unsigned integer, in hexadecimal %e a floating-point number, in scientific notation %f a floating-point number, in fixed decimal notation %g a floating-point number, in %e or %f notationКроме того, Perl допускает следующие широко поддерживаемые преобразования:
%X like %x, but using upper-case letters %E like %e, but using an upper-case "E" %G like %g, but with an upper-case "E" (if applicable) %b an unsigned integer, in binary %B like %b, but using an upper-case "B" with the # flag %p a pointer (outputs the Perl value's address in hexadecimal) %n special: *stores* the number of characters output so far into the next argument in the parameter list %a hexadecimal floating point %A like %a, but using upper-case lettersНаконец, для обратной (и мы имеем в виду "обратной") совместимости, Perl допускает эти ненужные, но широко поддерживаемые преобразования:
%i a synonym for %d %D a synonym for %ld %U a synonym for %lu %O a synonym for %lo %F a synonym for %fОбратите внимание, что количество цифр экспоненты в научной записи, производимой
%e,%E,%gи%Gдля чисел с модулем экспоненты меньше 100, зависит от системы: оно может быть тремя или менее (с нулевым заполнением по необходимости). Другими словами, 1,23 на десять в степени 99 может быть представлено как "1.23e99" или "1.23e099". То же самое относится к%aи%A: экспонента или шестнадцатеричные цифры могут «плавать»: особенно опция конфигурации Perl "long doubles" может вызвать неожиданности.Между
%и буквой формата, вы можете указать несколько дополнительных атрибутов, управляющих интерпретацией формата. В порядке перечисления:- индекс параметра формата
-
Явный индекс параметра формата, например
2$. По умолчанию sprintf отформатирует следующий неиспользуемый аргумент в списке, но это позволяет вам брать аргументы вне порядка:printf '%2$d %1$d', 12, 34; # prints "34 12" printf '%3$d %d %1$d', 1, 2, 3; # prints "3 1 1" - флаги
-
один или несколько из:
space prefix non-negative number with a space + prefix non-negative number with a plus sign - left-justify within the field 0 use zeros, not spaces, to right-justify # ensure the leading "0" for any octal, prefix non-zero hexadecimal with "0x" or "0X", prefix non-zero binary with "0b" or "0B"Например:
printf '<% d>', 12; # prints "< 12>" printf '<% d>', 0; # prints "< 0>" printf '<% d>', -12; # prints "<-12>" printf '<%+d>', 12; # prints "<+12>" printf '<%+d>', 0; # prints "<+0>" printf '<%+d>', -12; # prints "<-12>" printf '<%6s>', 12; # prints "< 12>" printf '<%-6s>', 12; # prints "<12 >" printf '<%06s>', 12; # prints "<000012>" printf '<%#o>', 12; # prints "<014>" printf '<%#x>', 12; # prints "<0xc>" printf '<%#X>', 12; # prints "<0XC>" printf '<%#b>', 12; # prints "<0b1100>" printf '<%#B>', 12; # prints "<0B1100>"Когда пробел и знак плюс заданы как флаги сразу, пробел игнорируется.
printf '<%+ d>', 12; # prints "<+12>" printf '<% +d>', 12; # prints "<+12>"Когда флаг # и точность заданы в преобразовании %o, точность увеличивается, если это необходимо для ведущей "0".
printf '<%#.5o>', 012; # prints "<00012>" printf '<%#.5o>', 012345; # prints "<012345>" printf '<%#.0o>', 0; # prints "<0>" - флаг вектора
-
Этот флаг сообщает Perl интерпретировать переданную строку как вектор целых чисел, по одному для каждого символа в строке. Perl применяет формат к каждому целому числу по очереди, затем соединяет результирующие строки с разделителем (точкой
.по умолчанию). Это может быть полезно для отображения порядковых значений символов в произвольных строках:printf "%vd", "AB\x{100}"; # prints "65.66.256" printf "version is v%vd\n", $^V; # Perl's versionПоставьте звездочку
*передvчтобы переопределить строку, используемую для разделения чисел:printf "address is %*vX\n", ":", $addr; # IPv6 address printf "bits are %0*v8b\n", " ", $bits; # random bitstringВы также можете явно указать номер аргумента, используемого для строки соединения, используя что-то вроде
*2$v; например:printf '%*4$vX %*4$vX %*4$vX', # 3 IPv6 addresses @addr[1..3], ":"; - (минимальная) ширина
-
Аргументы обычно форматируются только настолько широко, насколько это необходимо для отображения данного значения. Вы можете переопределить ширину, поместив число сюда, или получить ширину из следующего аргумента (с
*) или из указанного аргумента (например, с*2$):printf "<%s>", "a"; # prints "<a>" printf "<%6s>", "a"; # prints "< a>" printf "<%*s>", 6, "a"; # prints "< a>" printf '<%*2$s>', "a", 6; # prints "< a>" printf "<%2s>", "long"; # prints "<long>" (does not truncate)Если ширина поля, полученная через
*, отрицательная, это имеет тот же эффект, что и флаг-: выравнивание влево. - точность или максимальная ширина
-
Вы можете указать точность (для числовых преобразований) или максимальную ширину (для строковых преобразований), указав
., за которым следует число. Для чисел с плавающей запятой, кромеgиG, это определяет, сколько знаков после запятой отобразить (по умолчанию 6). Например:# these examples are subject to system-specific variation printf '<%f>', 1; # prints "<1.000000>" printf '<%.1f>', 1; # prints "<1.0>" printf '<%.0f>', 1; # prints "<1>" printf '<%e>', 10; # prints "<1.000000e+01>" printf '<%.1e>', 10; # prints "<1.0e+01>"Для "g" и "G" это определяет максимальное количество значащих цифр для отображения; например:
# These examples are subject to system-specific variation. printf '<%g>', 1; # prints "<1>" printf '<%.10g>', 1; # prints "<1>" printf '<%g>', 100; # prints "<100>" printf '<%.1g>', 100; # prints "<1e+02>" printf '<%.2g>', 100.01; # prints "<1e+02>" printf '<%.5g>', 100.01; # prints "<100.01>" printf '<%.4g>', 100.01; # prints "<100>" printf '<%.1g>', 0.0111; # prints "<0.01>" printf '<%.2g>', 0.0111; # prints "<0.011>" printf '<%.3g>', 0.0111; # prints "<0.0111>"Для целых преобразований, указание точности подразумевает, что вывод самого числа должен быть дополнен нулями до этой ширины, где флаг 0 игнорируется:
printf '<%.6d>', 1; # prints "<000001>" printf '<%+.6d>', 1; # prints "<+000001>" printf '<%-10.6d>', 1; # prints "<000001 >" printf '<%10.6d>', 1; # prints "< 000001>" printf '<%010.6d>', 1; # prints "< 000001>" printf '<%+10.6d>', 1; # prints "< +000001>" printf '<%.6x>', 1; # prints "<000001>" printf '<%#.6x>', 1; # prints "<0x000001>" printf '<%-10.6x>', 1; # prints "<000001 >" printf '<%10.6x>', 1; # prints "< 000001>" printf '<%010.6x>', 1; # prints "< 000001>" printf '<%#10.6x>', 1; # prints "< 0x000001>"Для строковых преобразований, указание точности обрезает строку до указанной ширины:
printf '<%.5s>', "truncated"; # prints "<trunc>" printf '<%10.5s>', "truncated"; # prints "< trunc>"Вы также можете получить точность из следующего аргумента с помощью
.*, или из указанного аргумента (например, с.*2$):printf '<%.6x>', 1; # prints "<000001>" printf '<%.*x>', 6, 1; # prints "<000001>" printf '<%.*2$x>', 1, 6; # prints "<000001>" printf '<%6.*2$x>', 1, 4; # prints "< 0001>"Если точность, полученная через
*, отрицательная, она считается отсутствующей.printf '<%.*s>', 7, "string"; # prints "<string>" printf '<%.*s>', 3, "string"; # prints "<str>" printf '<%.*s>', 0, "string"; # prints "<>" printf '<%.*s>', -1, "string"; # prints "<string>" printf '<%.*d>', 1, 0; # prints "<0>" printf '<%.*d>', 0, 0; # prints "<>" printf '<%.*d>', -1, 0; # prints "<0>" - размер
-
Для числовых преобразований вы можете указать размер для интерпретации числа с использованием
l,h,V,q,L, илиll. Для целочисленных преобразований (d u o x X b i D U O) числа обычно предполагаются имеющими размер по умолчанию на вашей платформе (обычно 32 или 64 бита), но вы можете переопределить его, используя один из стандартных типов C, поддерживаемых компилятором, используемым для построения Perl:hh interpret integer as C type "char" or "unsigned char" on Perl 5.14 or later h interpret integer as C type "short" or "unsigned short" j interpret integer as C type "intmax_t" on Perl 5.14 or later; and prior to Perl 5.30, only with a C99 compiler (unportable) l interpret integer as C type "long" or "unsigned long" q, L, or ll interpret integer as C type "long long", "unsigned long long", or "quad" (typically 64-bit integers) t interpret integer as C type "ptrdiff_t" on Perl 5.14 or later z interpret integer as C types "size_t" or "ssize_t" on Perl 5.14 or laterОбратите внимание, что в общем случае использование модификатора
l(например, при написании"%ld"или"%lu"вместо"%d"и"%u") не требуется при использовании из кода Perl. Более того, это может быть вредно, например, в 64-битной Windows, где long составляет 32 бита.Начиная с версии 5.14, ни один из этих случаев не вызывает исключение, если они не поддерживаются на вашей платформе. Однако, если включены предупреждения, выводится предупреждение класса предупреждений
printfо неподдерживаемом флаге преобразования. Если вы предпочитаете исключение, сделайте так:use warnings FATAL => "printf";Если вы хотите узнать о зависимости от версии до начала выполнения программы, поместите что-то вроде этого в её начало:
use v5.14; # for hh/j/t/z/ printf modifiersВы можете узнать, поддерживает ли ваш Perl quads, с помощью Config:
use Config; if ($Config{use64bitint} eq "define" || $Config{longsize} >= 8) { print "Nice quads!\n"; }Для преобразований чисел с плавающей точкой (
e f g E F G) числа обычно предполагаются имеющими размер по умолчанию на вашей платформе (double или long double), но вы можете принудительно установить "long double" с помощьюq,L, илиllесли ваша платформа их поддерживает. Вы можете узнать, поддерживает ли ваш Perl long doubles, с помощью Config:use Config; print "long doubles\n" if $Config{d_longdbl} eq "define";Вы можете узнать, считает ли Perl "long double" по умолчанию используемым типом чисел с плавающей точкой на вашей платформе, с помощью Config:
use Config; if ($Config{uselongdouble} eq "define") { print "long doubles by default\n"; }Возможно также, что long double и double — одно и то же:
use Config; ($Config{doublesize} == $Config{longdblsize}) && print "doubles are long doubles\n";Спесификатор размера
Vне оказывает никакого влияния на код Perl, но поддерживается для совместимости с кодом XS. Он означает "использовать стандартный размер для целого числа или числа с плавающей точкой Perl", что является значением по умолчанию. - порядок аргументов
-
Обычно
sprintfберёт следующий неиспользуемый аргумент в качестве значения для форматирования для каждого спецификатора формата. Если спецификатор формата использует*для требования дополнительных аргументов, они потребляются из списка аргументов в порядке их появления в спецификаторе формата до значения для форматирования. Когда аргумент задан явным индексом, это не влияет на обычный порядок аргументов, даже когда явным образом заданный индекс был бы следующим аргументом.Например:
printf "<%*.*s>", $a, $b, $c;использует
$aдля ширины,$bдля точности и$cв качестве значения для форматирования; в то время как:printf '<%*1$.*s>', $a, $b;было бы использовано
$aдля ширины и точности, и$bв качестве значения для форматирования.Вот ещё несколько примеров; имейте в виду, что при использовании явного индекса
$может потребоваться экранирование:printf "%2\$d %d\n", 12, 34; # will print "34 12\n" printf "%2\$d %d %d\n", 12, 34; # will print "34 12 34\n" printf "%3\$d %d %d\n", 12, 34, 56; # will print "56 12 34\n" printf "%2\$*3\$d %d\n", 12, 34, 3; # will print " 34 12\n" printf "%*1\$.*f\n", 4, 5, 10; # will print "5.0000\n"
Если
use locale(включаяuse locale ':not_characters') в эффекте иPOSIX::setlocaleбыл вызван, символ, используемый для разделителя десятичных знаков в отформатированных числах с плавающей точкой, зависит от локалейLC_NUMERIC. См. perllocale и POSIX. - sqrt EXPR
- sqrt
-
Возвращает положительный квадратный корень из EXPR. Если EXPR опущен, используется
$_. Работает только для неотрицательных операндов, если вы не загрузили модульMath::Complex.use Math::Complex; print sqrt(-4); # prints 2i - srand EXPR
- srand
-
Устанавливает и возвращает начальное значение генератора случайных чисел для оператора
rand.Функция предназначена для «инициализации» функции
rand, чтобы функцияrandгенерировала различные последовательности при каждом запуске программы. При вызове с параметром,srandиспользует этот параметр в качестве начального значения; в противном случае она (полу-)случайно выбирает начальное значение (см. ниже). В любом случае, начиная с Perl 5.14, она возвращает это начальное значение.Чтобы указать, что ваш код будет работать только с недавними версиями Perl:
use v5.14; # so srand returns the seedЕсли
srandне вызывается явно, она вызывается неявно без параметра при первом использовании оператораrand. Однако есть несколько ситуаций, в которых программы могут захотеть вызватьsrand. Одна из них — для генерации предсказуемых результатов, обычно для тестирования или отладки. В этом случае вы используетеsrand($seed), с тем же$seedкаждый раз. Другой случай — вы можете вызватьsrandпослеfork, чтобы избежать совместного использования дочерними процессами того же значения начального значения, что и родительским (и, следовательно, друг с другом).Не вызывайте
srand()(т. е. без аргумента) более одного раза в процессе. Внутреннее состояние генератора случайных чисел должно содержать больше энтропии, чем может обеспечить любое начальное значение, поэтому повторный вызовsrandфактически уменьшает случайность.Большинство реализаций
srandпринимают целое число и молча обрезают десятичные числа. Это означает, чтоsrand(42)обычно дает те же результаты, что иsrand(42.1). Для безопасности всегда передавайтеsrandцелое число.Типичное использование возвращаемого начального значения — для тестовой программы, у которой слишком много комбинаций для всестороннего тестирования в доступное время каждого запуска. Она может тестировать случайную подвыборку каждый раз и, если произойдет сбой, записывать используемое начальное значение для этого запуска, чтобы позже можно было воспроизвести те же результаты.
Если переменная среды
PERL_RAND_SEEDустановлена в неотрицательное целое число во время запуска процесса, то вызовыsrand()без аргументов инициализируют генератор случайных чисел Perl с постоянным начальным значением каждый раз, когда он вызывается, независимо от того, вызывается ли он явно без аргументов или неявно через использованиеrand(). Точное начальное значение, которое произведёт данныйPERL_RAND_SEED, преднамеренно не специфицируется, но использование разных значений дляPERL_RAND_SEEDдолжно давать разные результаты. Это предназначено для отладки и анализа производительности и гарантирует согласованные результаты между вызовами одной и той же исполняемой программы Perl, выполняющей один и тот же код, когда все остальные факторы одинаковы. Переменная среды читается только один раз во время запуска процесса, а изменение её во время выполнения программы не повлияет на текущий запущенный процесс. Более подробную информацию см. в perlrun.randне является криптографически безопасным. Не следует полагаться на него в ситуациях, чувствительных к безопасности. На момент написания этого текста ряд сторонних модулей CPAN предлагают генераторы случайных чисел, которые по мнению их авторов, являются криптографически безопасными, включая: Data::Entropy, Crypt::Random, Math::Random::Secure и Math::TrulyRandom. - stat FILEHANDLE
- stat EXPR
- stat DIRHANDLE
- stat
-
Возвращает список из 13 элементов, содержащий информацию о состоянии файла, либо файла, открытого через FILEHANDLE или DIRHANDLE, либо указанного EXPR. Если EXPR опущен, она получает состояние
$_(не_!). Возвращает пустой список, еслиstatзавершается неудачно. Обычно используется следующим образом:my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);Не все поля поддерживаются на всех типах файловых систем. Вот значения полей:
0 dev device number of filesystem 1 ino inode number 2 mode file mode (type and permissions) 3 nlink number of (hard) links to the file 4 uid numeric user ID of file's owner 5 gid numeric group ID of file's owner 6 rdev the device identifier (special files only) 7 size total size of file, in bytes 8 atime last access time in seconds since the epoch 9 mtime last modify time in seconds since the epoch 10 ctime inode change time in seconds since the epoch (*) 11 blksize preferred I/O size in bytes for interacting with the file (may vary from file to file) 12 blocks actual number of system-specific blocks allocated on disk (often, but not always, 512 bytes each)(Эпоха была 00:00 1 января 1970 года по Гринвичу.)
(*) Не все поля поддерживаются на всех типах файловых систем. Обратите внимание, что поле ctime не переносимо. В частности, вы не можете ожидать, что это будет «время создания»; см. "Файлы и файловые системы" в perlport для получения подробностей.
Если
statполучает специальный файловый дескриптор, состоящий из нижнего подчёркивания, то статистика не выполняется, а возвращаются текущие данные структуры stat из последнегоstat,lstatили filetest. Пример:if (-x $file && (($d) = stat(_)) && $d < 0) { print "$file is executable NFS file\n"; }(Это работает только на машинах, для которых номер устройства отрицательный в NFS.)
На некоторых платформах номера узлов имеют тип, больший, чем Perl может обработать как целые числовые значения. При необходимости номер узла возвращается как десятичная строка, чтобы сохранить всё значение. Если он используется в числовом контексте, он преобразуется в число с плавающей запятой с округлением, что лучше избегать. Поэтому следует предпочесть сравнивать номера узлов, используя
eq, а не==.eqпрекрасно работает с номерами узлов, представленными как числа, а также в виде строк.Поскольку режим содержит как тип файла, так и его разрешения, вам следует скрыть часть типа файла и использовать
"%o", если вы хотите увидеть реальные разрешения.my $mode = (stat($filename))[2]; printf "Permissions are %04o\n", $mode & 07777;В скалярном контексте
statвозвращает логическое значение, указывающее на успех или неудачу, и, в случае успеха, устанавливает информацию, связанную со специальным файловым дескриптором_.Модуль File::stat предоставляет удобный механизм доступа по имени:
use File::stat; my $sb = stat($filename); printf "File is %s, size is %s, perm %04o, mtime %s\n", $filename, $sb->size, $sb->mode & 07777, scalar localtime $sb->mtime;Вы можете импортировать символические константы режимов (
S_IF*) и функции (S_IS*) из модуля Fcntl:use Fcntl ':mode'; my $mode = (stat($filename))[2]; my $user_rwx = ($mode & S_IRWXU) >> 6; my $group_read = ($mode & S_IRGRP) >> 3; my $other_execute = $mode & S_IXOTH; printf "Permissions are %04o\n", S_IMODE($mode), "\n"; my $is_setuid = $mode & S_ISUID; my $is_directory = S_ISDIR($mode);Вы могли бы написать последние два, используя операторы
-uи-d. Обычно доступные константыS_IF*:# Permissions: read, write, execute, for user, group, others. S_IRWXU S_IRUSR S_IWUSR S_IXUSR S_IRWXG S_IRGRP S_IWGRP S_IXGRP S_IRWXO S_IROTH S_IWOTH S_IXOTH # Setuid/Setgid/Stickiness/SaveText. # Note that the exact meaning of these is system-dependent. S_ISUID S_ISGID S_ISVTX S_ISTXT # File types. Not all are necessarily available on # your system. S_IFREG S_IFDIR S_IFLNK S_IFBLK S_IFCHR S_IFIFO S_IFSOCK S_IFWHT S_ENFMT # The following are compatibility aliases for S_IRUSR, # S_IWUSR, and S_IXUSR. S_IREAD S_IWRITE S_IEXECи функции
S_IF*S_IMODE($mode) the part of $mode containing the permission bits and the setuid/setgid/sticky bits S_IFMT($mode) the part of $mode containing the file type which can be bit-anded with (for example) S_IFREG or with the following functions # The operators -f, -d, -l, -b, -c, -p, and -S. S_ISREG($mode) S_ISDIR($mode) S_ISLNK($mode) S_ISBLK($mode) S_ISCHR($mode) S_ISFIFO($mode) S_ISSOCK($mode) # No direct -X operator counterpart, but for the first one # the -g operator is often equivalent. The ENFMT stands for # record flocking enforcement, a platform-dependent feature. S_ISENFMT($mode) S_ISWHT($mode)См. документацию вашей среды по chmod(2) и stat(2) для получения дополнительной информации о константах
S_*. Чтобы получить информацию о состоянии символической ссылки, а не целевого файла за ссылкой, используйте функциюlstat.Вопросы переносимости: "stat" в perlport.
- state VARLIST
- state TYPE VARLIST
- state VARLIST : ATTRS
- state TYPE VARLIST : ATTRS
-
stateобъявляет переменную со сферой действия, подобноmy. Однако эти переменные никогда не будут повторно инициализированы в отличие от лексических переменных, которые повторно инициализируются каждый раз при входе в содержащий блок.Если перечислено более одной переменной, список должен быть помещён в скобки. С помещённым в скобки списком,
undefможет использоваться в качестве метки-заполнителя. Однако, поскольку инициализация переменных state в таких списках в настоящее время невозможна, это не будет иметь смысла.Повторное объявление переменной в том же объеме или операторе «затеняет» предыдущее объявление, создавая новый экземпляр и предотвращая доступ к предыдущему. Это обычно нежелательно и, если включены предупреждения, приведет к появлению предупреждения в категории
shadow.stateдоступен только в том случае, если включено"state"свойство или если оно префиксное сCORE::."state"свойство автоматически включается с объявлениемuse v5.10(или выше) в текущем объёме. - study SCALAR
- study
-
На данный момент
studyничего не делает. Это может измениться в будущем.До версии Perl 5.16, она создавала инвертированный индекс всех символов, которые встречались в заданном SCALAR (или
$_, если не указано). При сопоставлении с шаблоном наименее частый символ из шаблона ищется в этом индексе. Редкость основана на некоторых статических таблицах частот, построенных из некоторых программ C и английских текстов. - sub NAME BLOCK
- sub NAME (PROTO) BLOCK
- sub NAME : ATTRS BLOCK
- sub NAME (PROTO) : ATTRS BLOCK
-
Это определение подпрограммы, а не настоящая функция как таковая. Без блока — это просто объявление вперёд. Без имени — это объявление анонимной функции, поэтому возвращает значение: ссылку на код только что созданного замыкания.
См. perlsub и perlref для получения подробностей о подпрограммах и ссылках; см. attributes и Attribute::Handlers для получения дополнительной информации об атрибутах.
- __SUB__
-
Специальный маркер, который возвращает ссылку на текущую подпрограмму или
undefвне подпрограммы.Поведение
__SUB__внутри блока кода регулярного выражения (например,/(?{...})/) может измениться.Этот маркер доступен только в
use v5.16или с"current_sub"свойством. См. feature. - substr EXPR,OFFSET,LENGTH,REPLACEMENT
- substr EXPR,OFFSET,LENGTH
- substr EXPR,OFFSET
-
Извлекает подстроку из EXPR и возвращает её. Первый символ имеет смещение ноль. Если OFFSET отрицателен, начинается за столько символов от конца строки. Если LENGTH опущен, возвращает всю строку до конца. Если LENGTH отрицателен, оставляет столько символов в конце строки.
my $s = "The black cat climbed the green tree"; my $color = substr $s, 4, 5; # black my $middle = substr $s, 4, -11; # black cat climbed the my $end = substr $s, 14; # climbed the green tree my $tail = substr $s, -4; # tree my $z = substr $s, -4, 2; # trВы можете использовать функцию
substrв качестве левостороннего значения, в этом случае EXPR должен быть левосторонним значением. Если вы присваиваете значение короче LENGTH, строка уменьшится, а если длиннее, строка увеличится, чтобы вместить его. Чтобы сохранить длину строки, вам может потребоваться дополнить или укоротить ваше значение с помощьюsprintf.Если OFFSET и LENGTH задают подстроку, частично выходящую за пределы строки, возвращается только часть внутри строки. Если подстрока выходит за пределы строки с любой стороны,
substrвозвращает неопределённое значение и выводит предупреждение. При использовании в качестве левостороннего значения указание подстроки, полностью выходящей за пределы строки, вызывает исключение. Вот пример, демонстрирующий поведение в пограничных случаях:my $name = 'fred'; substr($name, 4) = 'dy'; # $name is now 'freddy' my $null = substr $name, 6, 2; # returns "" (no warning) my $oops = substr $name, 7; # returns undef, with warning substr($name, 7) = 'gap'; # raises an exceptionАльтернативой использованию
substrв качестве левостороннего значения является указание строки REPLACEMENT в качестве четвёртого аргумента. Это позволяет заменить части EXPR и вернуть то, что там было до этого, в одной операции, точно так же, как вы можете сsplice.my $s = "The black cat climbed the green tree"; my $z = substr $s, 14, 7, "jumped from"; # climbed # $s is now "The black cat jumped from the green tree"Обратите внимание, что левостороннее значение, возвращаемое трёхаргументной версией
substr, действует как «волшебная пуля»; каждый раз при присваивании он запоминает, какая часть исходной строки модифицируется; например:my $x = '1234'; for (substr($x,1,2)) { $_ = 'a'; print $x,"\n"; # prints 1a4 $_ = 'xyz'; print $x,"\n"; # prints 1xyz4 $x = '56789'; $_ = 'pq'; print $x,"\n"; # prints 5pq9 }При использовании отрицательных смещений он запоминает своё положение от конца строки при модификации целевой строки:
my $x = '1234'; for (substr($x, -3, 2)) { $_ = 'a'; print $x,"\n"; # prints 1a4, as above $x = 'abcdefg'; print $_,"\n"; # prints f }До версии Perl 5.10 результат использования левостороннего значения несколько раз был неопределённым. До версии 5.16 результат с отрицательными смещениями был неопределённым.
- symlink OLDFILE,NEWFILE
-
Создаёт новое имя файла, символически связанное со старым именем файла. Возвращает
1при успехе,0в противном случае. На системах, не поддерживающих символические ссылки, вызывает исключение. Чтобы проверить это, используйте eval:my $symlink_exists = eval { symlink("",""); 1 };Проблемы совместимости: "symlink" в perlport.
- syscall NUMBER, LIST
-
Вызывает системный вызов, указанный как первый элемент списка, передавая оставшиеся элементы в качестве аргументов системному вызову. Если не реализован, вызывает исключение. Аргументы интерпретируются следующим образом: если данный аргумент является числовым, аргумент передаётся как целое число. Если нет, передаётся указатель на строковое значение. Вы несёте ответственность за то, чтобы строка была достаточно предварительно расширена, чтобы получить любой результат, который может быть записан в строку. Вы не можете использовать строковый литерал (или другую неизменяемую строку) в качестве аргумента для
syscall, потому что Perl должен предполагать, что любой указатель на строку может быть записан. Если ваши целочисленные аргументы не являются литералами и никогда не интерпретировались в числовом контексте, вам может потребоваться добавить0к ним, чтобы заставить их выглядеть как числа. Это эмулирует функциюsyswrite(или наоборот):require 'syscall.ph'; # may need to run h2ph my $s = "hi there\n"; syscall(SYS_write(), fileno(STDOUT), $s, length $s);Обратите внимание, что Perl поддерживает передачу не более 14 аргументов в ваш системный вызов, чего, на практике, должно (обычно) быть достаточно.
Syscall возвращает то значение, которое возвращает вызываемый системный вызов. Если системный вызов завершается неудачей,
syscallвозвращает-1и устанавливает$!(errno). Обратите внимание, что некоторые системные вызовы могут законно вернуть-1. Правильный способ обработки таких вызовов — присвоить$! = 0перед вызовом, а затем проверить значение$!, еслиsyscallвозвращает-1.Проблема с
syscall(SYS_pipe()): она возвращает номер файла входного конца создаваемой им трубы, но нет способа получить номер файла другого конца. Вы можете избежать этой проблемы, используяpipeвместо этого.Проблемы совместимости: "syscall" в perlport.
- sysopen FILEHANDLE,FILENAME,MODE
- sysopen FILEHANDLE,FILENAME,MODE,PERMS
-
Открывает файл с именем FILENAME и связывает его с FILEHANDLE. Если FILEHANDLE — выражение, его значение используется как фактический файловый дескриптор; неопределённый скаляр будет уместно автоматизирован. Эта функция вызывает функцию базовой операционной системы open(2) с параметрами FILENAME, MODE и PERMS.
Возвращает true при успехе и
undefв противном случае.PerlIO слои будут применены к дескриптору так же, как и при вызове
open, который не указывает слои. То есть, текущее значение${^OPEN}, установленное прагмой open в лексическом пространстве, или параметр командной строки-Cили переменная окруженияPERL_UNICODEв основном пространстве программы, с отступлением к значениям по умолчанию платформы, как описано в "Значения по умолчанию и как их переопределить" в PerlIO. Если вы хотите удалить все слои, которые могут преобразовать поток байтов, используйтеbinmodeпосле открытия.Возможные значения и флаги параметра MODE зависят от системы; они доступны через стандартный модуль
Fcntl. См. документацию системного вызова open(2) вашей операционной системы, чтобы увидеть, какие значения и флаги доступны. Вы можете объединить несколько флагов с помощью оператора|.Некоторые из наиболее распространённых значений —
O_RDONLYдля открытия файла только для чтения,O_WRONLYдля открытия файла только для записи иO_RDWRдля открытия файла для чтения и записи.По историческим причинам некоторые значения работают практически на всех системах, поддерживаемых Perl: 0 означает только чтение, 1 означает только запись, а 2 означает чтение/запись. Нам известно, что эти значения не работают в OS/390; вы, вероятно, не захотите использовать их в новом коде.
Если файл с именем FILENAME не существует и вызов
openсоздаёт его (обычно потому, что MODE включает флагO_CREAT), то значение PERMS задаёт права нового файла. Если вы опустите аргумент PERMS дляsysopen, Perl использует восьмеричное значение0666. Эти значения разрешений должны быть в восьмеричном формате и модифицируются текущим значениемumaskвашего процесса.Во многих системах доступен флаг
O_EXCLдля открытия файлов в режиме эксклюзивного доступа. Это не блокировка: эксклюзивность здесь означает, что если файл уже существует,sysopenзавершается неудачей.O_EXCLможет не работать на сетевых файловых системах и не имеет эффекта, если не установлен флагO_CREAT. УстановкаO_CREAT|O_EXCLпредотвращает открытие файла, если это символическая ссылка. Это не защищает от символических ссылок в пути файла.Иногда вам может потребоваться обнулить уже существующий файл. Это можно сделать, используя флаг
O_TRUNC. ПоведениеO_TRUNCс флагомO_RDONLYне определено.Вы редко, если вообще, должны использовать
0644в качестве аргумента кsysopen, поскольку это лишает пользователя возможности иметь более либеральную маску. Лучше его опустить. См.umaskдля получения дополнительной информации об этом.Эта функция не имеет прямой связи с использованием
sysread,syswriteилиsysseek. Дескриптор файла, открытый с помощью этой функции, может использоваться с буферизованным вводом/выводом так же, как и открытый сopenможет использоваться с небуферизованным вводом/выводом.Обратите внимание, что в Perl-версиях, более старых, чем 5.8.0,
sysopenзависит от функции fdopen(3) C-библиотеки. На многих Unix-системах fdopen(3) известен тем, что терпит неудачу, когда дескрипторы файлов превышают определённое значение, обычно 255. Если вам нужны дескрипторы файлов, превышающие это значение, рассмотрите функциюPOSIX::open. Для Perl 5.8.0 и более поздних версий PerlIO является (чаще всего) значением по умолчанию.См. perlopentut для более простого объяснения открытия файлов.
Проблемы совместимости: "sysopen" в perlport.
- sysread FILEHANDLE,SCALAR,LENGTH,OFFSET
- sysread FILEHANDLE,SCALAR,LENGTH
-
Попытка прочитать LENGTH байтов данных в переменную SCALAR из указанного FILEHANDLE, используя read(2). Она опускает все слои PerlIO, включая буферизованный ввод-вывод (но учитывает наличие слоя
:utf8, как описано позже), поэтому смешивание этого с другими видами чтения,print,write,seek,tellилиeofможет вызвать путаницу, потому что слои:perlioили:crlfобычно буферизуют данные. Возвращает количество фактически прочитанных байтов,0в конце файла, или undef, если произошла ошибка (в последнем случае$!также устанавливается). SCALAR будет увеличен или уменьшен так, чтобы последний фактически прочитанный байт был последним байтом скаляра после чтения.Можно указать OFFSET для размещения прочитанных данных в определённой позиции строки, а не в начале. Отрицательный OFFSET указывает на позицию, отсчитываемую назад от конца строки на указанное число символов. Положительный OFFSET, больший длины SCALAR, приводит к дополнению строки до необходимой длины символами
"\0"перед добавлением результата чтения.Функции syseof() не существует, что нормально, так как
eofне работает хорошо с файлами устройств (например, ttys). Используйтеsysreadи проверяйте возвращаемое значение на 0, чтобы определить, закончено ли чтение.Обратите внимание, что если для файлового дескриптора установлен флаг
:utf8,sysreadвыбросит исключение. Слой:encoding(...)неявно вводит слой:utf8. См.binmode,openи прагму open. - sysseek FILEHANDLE,POSITION,WHENCE
-
Устанавливает системную позицию FILEHANDLE в байтах, используя lseek(2). FILEHANDLE может быть выражением, значение которого даёт имя файлового дескриптора. Значения для WHENCE:
0для установки новой позиции в POSITION;1для установки позиции равной текущей позиции плюс POSITION; и2для установки позиции равной концу файла плюс POSITION, обычно отрицательное значение.Обратите внимание на акцент на байтах: даже если файловый дескриптор настроен на работу с символами (например, с использованием слоя ввода-вывода
:encoding(UTF-8)), функцииseek,tellиsysseekиспользуют байтовые смещения, а не смещения символов, так как поиск по смещениям символов в файле UTF-8 будет очень медленным.sysseekобходит обычный буферизованный ввод-вывод, поэтому смешивание его с чтениями, отличными отsysread(например,readlineилиread),print,write,seek,tellилиeofможет вызвать путаницу.Для WHENCE можно также использовать константы
SEEK_SET,SEEK_CUR, иSEEK_END(начало файла, текущая позиция, конец файла) из модуля Fcntl. Использование констант также более переносимо, чем использование 0, 1 и 2. Например, для определения функции «systell»:use Fcntl 'SEEK_CUR'; sub systell { sysseek($_[0], 0, SEEK_CUR) }Возвращает новую позицию или undefined при ошибке. Позиция 0 возвращается как строка
"0 but true"; таким образомsysseekвозвращает true при успехе и false при ошибке, но вы всё ещё можете легко определить новую позицию. - system LIST
- system PROGRAM LIST
-
Делает ровно то же, что и
exec, за исключением того, что сначала выполняется fork, и родительский процесс ожидает завершения дочернего процесса. Обратите внимание, что обработка аргументов зависит от количества аргументов. Если в LIST более одного аргумента, или если LIST — массив с более чем одним значением, запускает программу, указанную первым элементом списка, с аргументами, заданными остальными элементами списка. Если аргументом является только один скаляр, аргумент проверяется на наличие метасимволов оболочки, и если они есть, весь аргумент передаётся командной оболочке системы для анализа (это/bin/sh -cна Unix-платформах, но отличается на других платформах). Если в аргументе нет метасимволов оболочки, он разбивается на слова и передаётся непосредственно вexecvp, что более эффективно. В Windows только синтаксисsystem PROGRAM LISTнадёжно избежит использования оболочки;system LIST, даже с несколькими элементами, вернётся к оболочке, если первый запуск неудачен.Perl попытается сбросить все файлы, открытые для вывода, перед любой операцией, которая может выполнить fork, но это может быть не поддерживается на некоторых платформах (см. perlport). Для безопасности, возможно, вам потребуется установить
$|($AUTOFLUSHв English) или вызвать методautoflushметодаIO::Handleдля всех открытых дескрипторов.Возвращаемое значение — код завершения программы, возвращённый вызовом
wait. Для получения фактического значения выхода, сдвиньте вправо на восемь (см. ниже). См. такжеexec. Это не то, что нужно использовать для захвата вывода команды; для этого следует использовать обратные кавычки илиqx//, как описано в "`STRING`" в perlop. Возвращаемое значение -1 указывает на неудачу запуска программы или ошибку системного вызова wait(2) (проверьте$!для причины).Если вы хотите, чтобы
system(и многие другие фрагменты Perl) погибали при ошибке, обратите внимание на прагму autodie.Подобно
exec,systemпозволяет вам лгать программе о её имени, если вы используете синтаксисsystem PROGRAM LIST. Опять же, см.exec.Поскольку
SIGINTиSIGQUITигнорируются во время выполненияsystem, если вы ожидаете, что ваша программа завершится при получении этих сигналов, вам нужно будет сделать это самостоятельно, основываясь на возвращаемом значении.my @args = ("command", "arg1", "arg2"); system(@args) == 0 or die "system @args failed: $?";Если вы хотите вручную проверить ошибку
system, вы можете проверить все возможные режимы ошибок, проверив$?так:if ($? == -1) { print "failed to execute: $!\n"; } elsif ($? & 127) { printf "child died with signal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'with' : 'without'; } else { printf "child exited with value %d\n", $? >> 8; }В качестве альтернативы, вы можете проверить значение
${^CHILD_ERROR_NATIVE}с помощью вызововW*()из модуля POSIX.Когда аргументы
systemвыполняются косвенно оболочкой, результаты и коды возврата зависят от её особенностей. Подробности см. в "`STRING`" в perlop иexec.Так как
systemвыполняетforkиwait, это может повлиять на обработчикSIGCHLD. Подробности см. в perlipc.Проблемы переносимости: "system" in perlport.
- syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET
- syswrite FILEHANDLE,SCALAR,LENGTH
- syswrite FILEHANDLE,SCALAR
-
Попытка записи LENGTH байтов данных из переменной SCALAR в указанный FILEHANDLE, используя write(2). Если LENGTH не указан, записывается весь SCALAR. Она опускает все слои PerlIO, включая буферизованный ввод-вывод (но учитывает наличие слоя
:utf8как описано позже), поэтому смешивание этого с чтениями (кромеsysread)),print,write,seek,tellилиeofможет вызвать путаницу, потому что слои:perlioи:crlfобычно буферизуют данные. Возвращает количество фактически записанных байтов илиundefпри ошибке (в этом случае переменная errno$!также устанавливается). Если LENGTH больше, чем доступных данных в SCALAR после OFFSET, записывается только доступное количество данных.Можно указать OFFSET для записи данных из определённой части строки, а не из начала. Отрицательный OFFSET указывает на позицию, отсчитываемую назад от конца строки на указанное число символов. Если SCALAR имеет длину 0, можно использовать только OFFSET 0.
ПРЕДУПРЕЖДЕНИЕ: Если файловый дескриптор помечен как
:utf8,syswriteвыбросит исключение. Слой:encoding(...)неявно вводит слой:utf8. В противном случае, если для дескриптора не задан кодировщик, но вы пытаетесь записать символы с кодами больше 255, вызовет исключение. См.binmode,openи прагму open. - tell FILEHANDLE
- tell
-
Возвращает текущую позицию в байтах для FILEHANDLE, или -1 при ошибке. FILEHANDLE может быть выражением, значение которого даёт имя фактического файлового дескриптора. Если FILEHANDLE опущен, предполагается последний прочитанный файл.
Обратите внимание на акцент на байтах: даже если файловый дескриптор настроен на работу с символами (например, с помощью
:encoding(UTF-8)) слоя ввода-вывода,seek,tellиsysseekсемейство функций используют смещения в байтах, а не в символах, так как поиск по смещению в символах был бы очень медленным в файле UTF-8.Значение возвращаемое
tellдля стандартных потоков, таких как STDIN, зависит от операционной системы: оно может возвращать -1 или что-то другое.tellдля каналов, fifo и сокетов обычно возвращает -1.Функции
systellнет. Используйтеsysseek($fh, 0, 1)для этого.Не используйте
tell(или другие операции с буферизированным вводом-выводом) с файловым дескриптором, который был изменён с помощьюsysread,syswriteилиsysseek. Эти функции игнорируют буферизацию, в то время какtell- нет. - telldir DIRHANDLE
-
Возвращает текущую позицию
readdirфункций для DIRHANDLE. Значение может быть переданоseekdirдля доступа к определённому местоположению в каталоге.telldirимеет те же замечания о возможной уплотнении каталогов, что и соответствующая системная библиотечная функция. - tie VARIABLE,CLASSNAME,LIST
-
Эта функция связывает переменную с классом пакета, который обеспечит реализацию для переменной. VARIABLE - имя переменной, которую нужно "очаровать". CLASSNAME - имя класса, реализующего объекты правильного типа. Любые дополнительные аргументы передаются в соответствующий конструктор метода класса (то есть
TIESCALAR,TIEHANDLE,TIEARRAY, илиTIEHASH). Как правило, это аргументы, которые могут быть переданы в функцию dbm_open(3) языка C. Объект, возвращённый конструктором, также возвращается функциейtie, что было бы полезно, если вы хотите получить доступ к другим методам в CLASSNAME.Обратите внимание, что такие функции, как
keysиvalues, могут возвращать огромные списки при использовании с большими объектами, такими как файлы DBM. Вы можете предпочесть использовать функциюeachдля итерации по таким объектам. Пример:# print out history file offsets use NDBM_File; tie(my %HIST, 'NDBM_File', '/usr/lib/news/history', 1, 0); while (my ($key,$val) = each %HIST) { print $key, ' = ', unpack('L', $val), "\n"; }Класс, реализующий хеш, должен иметь следующие методы:
TIEHASH classname, LIST FETCH this, key STORE this, key, value DELETE this, key CLEAR this EXISTS this, key FIRSTKEY this NEXTKEY this, lastkey SCALAR this DESTROY this UNTIE thisКласс, реализующий обычный массив, должен иметь следующие методы:
TIEARRAY classname, LIST FETCH this, key STORE this, key, value FETCHSIZE this STORESIZE this, count CLEAR this PUSH this, LIST POP this SHIFT this UNSHIFT this, LIST SPLICE this, offset, length, LIST EXTEND this, count DELETE this, key EXISTS this, key DESTROY this UNTIE thisКласс, реализующий файловый дескриптор, должен иметь следующие методы:
TIEHANDLE classname, LIST READ this, scalar, length, offset READLINE this GETC this WRITE this, scalar, length, offset PRINT this, LIST PRINTF this, format, LIST BINMODE this EOF this FILENO this SEEK this, position, whence TELL this OPEN this, mode, LIST CLOSE this DESTROY this UNTIE thisНе все указанные выше методы должны быть реализованы. См. perltie, Tie::Hash, Tie::Array, Tie::Scalar и Tie::Handle.
В отличие от
dbmopen, функцияtieне будетuseилиrequireмодуля за вас; вам нужно сделать это явным образом. См. DB_File или модуль Config для интересных реализацийtie. - tied VARIABLE
-
Возвращает ссылку на объект, лежащий в основе VARIABLE (то же самое значение, которое первоначально было возвращено вызовом
tie, который связал переменную с пакетом.) Возвращает неопределённое значение, если VARIABLE не связана с пакетом. - time
-
Возвращает количество не високосных секунд с момента, который система считает эпохой, подходящее для передачи в
gmtimeиlocaltime. На большинстве систем эпохой является 00:00:00 UTC, 1 января 1970 года; заметным исключением является Mac OS Classic, которая использует 00:00:00, 1 января 1904 года в текущей часовой зоне для своей эпохи.Для измерения времени с лучшей точностью, чем одна секунда, используйте модуль Time::HiRes из Perl 5.8 и выше (или из CPAN до этого), или, если у вас есть gettimeofday(2), вы можете использовать интерфейс
syscallPerl. См. perlfaq8 для получения подробностей.Для обработки дат и времени посмотрите на множество связанных модулей на CPAN. Для комплексного представления дат и времени посмотрите модуль DateTime.
- times
-
Возвращает список из четырёх элементов, содержащий время пользователя и системы в секундах для данного процесса и всех завершенных дочерних процессов этого процесса.
my ($user,$system,$cuser,$csystem) = times;В скалярном контексте
timesвозвращает$userВремя дочерних процессов включается только для завершенных дочерних процессов.
Проблемы с переносимостью: "times" в perlport.
- tr///
-
Оператор транслитерации. То же самое, что и
y///. См. "Quote-Like Operators" в perlop. - truncate FILEHANDLE,LENGTH
- truncate EXPR,LENGTH
-
Усекает файл, открытый в FILEHANDLE, или названный EXPR, до указанной длины. Вызывает исключение, если truncate не реализован на вашей системе. Возвращает true, если успешно,
undefпри ошибке.Поведение является неопределённым, если LENGTH больше длины файла.
Позиция в файле FILEHANDLE остаётся неизменной. Вы можете вызвать seek перед записью в файл.
Проблемы с переносимостью: "truncate" в perlport.
- uc EXPR
- uc
-
Возвращает версию EXPR в верхнем регистре. Если EXPR опущен, используется
$_.my $str = uc("Perl is GREAT"); # "PERL IS GREAT"Эта функция ведёт себя одинаково при различных предикатах, таких как в локале, как и
lc.Если вам нужна настройка верхнего регистра для начальных букв, используйте
ucfirstвместо этого.Примечание: Это внутренняя функция, реализующая escape
\Uв строках с двойными кавычками.my $str = "Perl is \Ugreat\E"; # "Perl is GREAT" - ucfirst EXPR
- ucfirst
-
Возвращает значение EXPR с первой буквой в верхнем регистре (Unicode называет это заглавным). Если EXPR опущен,
ucfirstиспользует$_.my $str = ucfirst("hello world!"); # "Hello world!"Эта функция ведёт себя одинаково при различных предикатах, таких как в локале, как и
lc.Примечание: Это внутренняя функция, реализующая escape
\uв строках с двойными кавычками.my $str = "\uperl\E is great"; # "Perl is great" - umask EXPR
- umask
-
Устанавливает umask для процесса на EXPR и возвращает предыдущее значение. Если EXPR опущен, просто возвращает текущий umask.
Права доступа в Unix
rwxr-x---представлены как три набора из трёх бит или три восьмеричные цифры:0750(ведущая 0 обозначает восьмеричную систему и не является одной из цифр). Значениеumask- это такое число, представляющее отключённые биты прав доступа. Значения прав доступа (или "режим"), которые вы передаётеmkdirилиsysopen, изменяются вашим umask, поэтому даже если вы скажетеsysopenсоздать файл с правами0777, если ваш umask равен0022, то файл фактически будет создан с правами0755. Если вашumaskбыл бы0027(группа не может писать; другие не могут читать, писать или выполнять), то передачаsysopen0666создаст файл с режимом0640(потому что0666 &~ 027это0640).Вот совет: используйте режим создания
0666для обычных файлов (вsysopen) и один из0777для каталогов (вmkdir) и исполняемых файлов. Это даёт пользователям свободу выбора: если они хотят защищённые файлы, они могут выбрать маски umask процесса022,027или даже особенно антисоциальную маску077. Программы редко, если вообще, должны принимать решения о политике, которые лучше оставить пользователю. Исключением из этого являются файлы, которые должны быть конфиденциальными: файлы почты, файлы cookie веб-браузера, файлы .rhosts и так далее.Если umask(2) не реализован на вашей системе и вы пытаетесь ограничить доступ для себя (т.е.
(EXPR & 0700) > 0), возникает исключение. Если umask(2) не реализован и вы не пытаетесь ограничить доступ для себя, возвращаетсяundef.Помните, что umask - это число, обычно задаваемое в восьмеричной системе; это не строка восьмеричных цифр. См. также
oct, если у вас есть только строка.Проблемы с переносимостью: "umask" в perlport.
- undef EXPR
- undef
-
Определяет значение EXPR, которое должно быть lvalue. Используйте только со скалярным значением, массивом (используя
@), хэш-таблицей (используя%), подпрограммой (используя&) или typeglob (используя*). Заявлениеundef $hash{$key}, вероятно, не выполнит ожидаемого действия для большинства предопределённых переменных или значений списков DBM, поэтому не делайте этого; см.delete. Всегда возвращает неопределённое значение. Вы можете опустить EXPR, в этом случае ничего не будет определено, но вы всё равно получите неопределённое значение, которое можно, например, вернуть из подпрограммы, присвоить переменной или передать в качестве параметра. Примеры:undef $foo; undef $bar{'blurfl'}; # Compare to: delete $bar{'blurfl'}; undef @ary; undef %hash; undef &mysub; undef *xyz; # destroys $xyz, @xyz, %xyz, &xyz, etc. return (wantarray ? (undef, $errmsg) : undef) if $they_blew_it; select undef, undef, undef, 0.25; my ($x, $y, undef, $z) = foo(); # Ignore third value returnedОбратите внимание, что это унарный оператор, а не оператор списка.
- unlink LIST
- unlink
-
Удаляет список файлов. При успешном выполнении возвращает количество успешно удалённых файлов. При ошибке возвращает false и устанавливает
$!(errno):my $unlinked = unlink 'a', 'b', 'c'; unlink @goners; unlink glob "*.bak";При ошибке
unlinkне сообщит вам, какие файлы не удалось удалить. Если вы хотите узнать, какие файлы не удалось удалить, попробуйте удалить их по одному:foreach my $file ( @goners ) { unlink $file or warn "Could not unlink $file: $!"; }Примечание:
unlinkне будет пытаться удалить каталоги, если вы не являетесь суперпользователем и не указан флаг -U для Perl. Даже если эти условия соблюдаются, будьте осторожны, так как удаление каталога может повредить вашу файловую систему. Наконец, использованиеunlinkс каталогами не поддерживается во многих операционных системах. Используйтеrmdirвместо этого. - unpack TEMPLATE,EXPR
- unpack TEMPLATE
-
unpackвыполняет обратную операцию по отношению кpack: он принимает строку и расширяет её в список значений. (В скалярном контексте он возвращает только первое сгенерированное значение.)Если EXPR опущен, происходит распаковка строки
$_. См. perlpacktut для введения в эту функцию.Строка разбивается на фрагменты, описанные шаблоном TEMPLATE. Каждый фрагмент преобразуется в отдельное значение. Обычно строка является результатом применения функции
pack, или символы строки представляют собой некий C-структуру.Шаблон TEMPLATE имеет тот же формат, что и в функции
pack. Вот подпрограмма, выполняющая подстрочное извлечение:sub substr { my ($what, $where, $howmuch) = @_; unpack("x$where a$howmuch", $what); }и затем есть
sub ordinal { unpack("W",$_[0]); } # same as ord()В дополнение к полям, разрешенным в
pack, вы можете добавить префикс %<число> к полю, чтобы указать, что вы хотите вычислить контрольную сумму <число>-разрядную контрольную сумму элементов, вместо самих элементов. По умолчанию используется 16-разрядная контрольная сумма. Контрольная сумма вычисляется путем суммирования числовых значений расширенных значений (для строковых полей берётся сумма символьных кодов; для битовых полей — сумма нулей и единиц).Например, следующее вычисляет то же число, что и программа System V sum:
my $checksum = do { local $/; # slurp! unpack("%32W*", readline) % 65535; };Следующее эффективно подсчитывает количество установленных битов в битовом векторе:
my $setbits = unpack("%32b*", $selectmask);Форматы
pиPследует использовать с осторожностью. Поскольку Perl не может проверить, соответствует ли значение, переданноеunpack, валидному месту памяти, передача указателя, который не известен как валидный, вероятно, приведёт к катастрофическим последствиям.Если существует больше кодов упаковки или если количество повторений поля или группы больше, чем позволяет оставшаяся часть входной строки, результат не определён: количество повторений может быть уменьшено, или
unpackможет создать пустые строки или нули, или может вызвать исключение. Если входная строка длиннее, чем та, которая описывается TEMPLATE, оставшаяся часть входной строки игнорируется.См.
packдля дополнительных примеров и замечаний. - unshift ARRAY,LIST
-
Добавляет один или несколько элементов в начало массива. Это противоположность
shift.my @animals = ("cat"); unshift(@animals, "mouse"); # ("mouse", "cat") my @colors = ("red"); unshift(@colors, ("blue", "green")); # ("blue", "green", "red")Возвращает новое количество элементов в обновлённом массиве.
# Return value is the number of items in the updated array my $color_count = unshift(@colors, ("yellow", "purple")); say "There are $color_count colors in the updated array";Обратите внимание, что LIST добавляется целиком, а не по одному элементу за раз, поэтому добавленные элементы сохраняют свой порядок. Используйте
reverseдля обратного порядка.Начиная с Perl 5.14, экспериментальная функция позволяла
unshiftпринимать скалярное выражение. Этот эксперимент признан неудачным и был удалён в Perl 5.24. - untie VARIABLE
-
Прерывает привязку между переменной и пакетом. (См. tie.) Не имеет эффекта, если переменная не привязана.
- use Module VERSION LIST
- use Module VERSION
- use Module LIST
- use Module
-
Импортирует семантику из указанного модуля в текущий пакет, обычно, путём алиасирования определенных подпрограмм или переменных в ваш пакет. Это точно эквивалентно
BEGIN { require Module; Module->import( LIST ); }за исключением того, что Module обязательно должен быть идентификатором. Импорт может быть условным путём использования модуля if.
Ключевое слово
BEGINзаставляетrequireиimportпроисходить во время компиляции.requireгарантирует, что модуль загружен в память, если он ещё не был загружен.import— это не встроенная функция; это просто обычный статический вызов метода в пакетModule, чтобы сообщить модулю импортировать список функций обратно в текущий пакет. Модуль может реализовать методimportлюбым способом, хотя большинство модулей просто выбирают получение методаimportчерез наследование от классаExporter, определённого в модулеExporter. См. Exporter. Если методimportне найден, вызов пропускается, даже если есть метод AUTOLOAD.Если вы не хотите вызывать метод пакета
import(например, чтобы не изменять ваше пространство имён), явно укажите пустой список:use Module ();Это точно эквивалентно
BEGIN { require Module }Если аргумент VERSION присутствует между Module и LIST, то
useвызовет методVERSIONв классе Module с заданной версией в качестве аргумента:use Module 12.34;эквивалентно:
BEGIN { require Module; Module->VERSION(12.34) }метод
VERSIONпо умолчанию, унаследованный от классаUNIVERSAL, вызывает ошибку, если заданная версия больше значения переменной$Module::VERSION.Аргумент VERSION не может быть произвольным выражением. Он считается аргументом VERSION только если это числовая версия, начинающаяся либо с цифры, либо с
v, за которой следует цифра. Всё, что не выглядит как числовая версия, будет интерпретироваться как начало LIST. Тем не менее, многие попытки использовать произвольное выражение в качестве аргумента VERSION будут работать, так как методimportмодуля Exporter обрабатывает числовые аргументы особым образом, выполняя проверки версий вместо обработки их как элементов для экспорта.Ещё раз, есть разница между пропусканием LIST (
importвызывается без аргументов) и явным указанием пустого LIST()(importне вызывается). Обратите внимание, что после VERSION нет запятой!Так как это широко открытый интерфейс, аналогичным образом реализованы и псевдо-модули (директивы компилятора). Некоторые из текущих реализованных псевдо-модулей:
use constant; use diagnostics; use integer; use sigtrap qw(SEGV BUS); use strict qw(subs vars refs); use subs qw(afunc blurfl); use warnings qw(all); use sort qw(stable);Некоторые из этих псевдо-модулей импортируют семантику в текущее пространство имён (например,
strictилиinteger), в отличие от обычных модулей, которые импортируют символы в текущий пакет (действующие до конца файла).Поскольку
useвыполняется во время компиляции, оно не учитывает обычный порядок выполнения кода, который компилируется. В частности, размещениеuseв ложном ветвлении условного оператора не препятствует его обработке. Если модуль или псевдо-модуль должен быть загружен условно, это можно сделать с помощью псевдо-модуля if:use if $] < 5.008, "utf8"; use if WANT_WARNINGS, warnings => qw(all);Существует соответствующая директива
no, которая отменяет импорт семантики, импортированнойuse, т.е. она вызываетModule->unimport(LIST)вместоimport. Она ведёт себя аналогичноimportс VERSION, опущенным или пустым LIST или отсутствием метода unimport.no integer; no strict 'refs'; no warnings;См. perlmodlib для списка стандартных модулей и псевдо-модулей. См. perlrun для
-Mи-mкомандной строки Perl, предоставляющих функциональностьuseиз командной строки. - use VERSION
-
Лексически включает все функции, доступные в запрошенной версии, как определено прагмой feature, отключая любые функции, отсутствующие в наборе функций запрошенной версии. См. feature.
VERSION может быть строкой, начинающейся с «v», такой как v5.24.1, которая будет сравниваться с
$^V(также $PERL_VERSION), или числовым аргументом в формате 5.024001, который будет сравниваться с$]. Если VERSION больше версии текущего интерпретатора Perl, возникает исключение; Perl не будет пытаться обработать остальную часть файла. Сравните сrequire, который может выполнить аналогичную проверку во время выполнения.Если указанная версия Perl 5.12 или выше, ограничения активируются лексически, как и с
use strict. Аналогично, если указанная версия Perl 5.35.0 или выше, предупреждения включаются. Позже использованиеuse VERSIONпереопределит всё поведение предыдущегоuse VERSION, возможно, удаливstrict,warnings, иfeatureдобавленные им.use VERSIONне загружает файлы feature.pm, strict.pm или warnings.pm.В текущей реализации любое явное использование
use strictилиno strictпереопределяетuse VERSION, даже если оно предшествует ему. Однако это может быть изменено в будущих релизах Perl, поэтому новый код не должен полагаться на этот факт. Рекомендуется, чтобы объявлениеuse VERSIONбыло первым значимым оператором в файле (возможно, после оператораpackageили любого количества пробелов или комментариев), чтобы его эффекты происходили первыми, а другие прагмы применялись после него.Указание VERSION в виде числового аргумента формата 5.024001 следует избегать, так как это более устаревший и менее читаемый синтаксис по сравнению с v5.24.1. До выпуска perl 5.8.0 в 2002 году более подробный числовой формат был единственным поддерживаемым синтаксисом, поэтому вы можете встретить его в старом коде.
use v5.24.1; # compile time version check use 5.24.1; # ditto use 5.024_001; # ditto; older syntax compatible with perl 5.6Это часто полезно, если вам нужно проверить текущую версию Perl перед
useзагрузкой модулей библиотеки, которые не будут работать со старыми версиями Perl. (Мы стараемся не делать этого больше, чем необходимо.)Симметрично,
no VERSIONпозволяет указать, что вам нужна версия Perl, более старая, чем указанная. Исторически это было добавлено во время ранней разработки языка Raku (ранее "Perl 6"), чтобы программа Perl 5 могла начинатьno 6;объявлять, что она не является программой Perl 6. Поскольку два языка имеют разные реализации, соглашения об именовании файлов и другую инфраструктуру, эта функция сейчас мало используется на практике и должна быть избегаема в вновь написанном коде.
Следует быть осторожным при использовании формы
no VERSION, поскольку она только предназначена для утверждения, что работающий Perl имеет более раннюю версию, чем его аргумент, и не для отмены эффектов включения функций с помощьюuse VERSION. - utime LIST
-
Изменяет время доступа и изменения каждого файла в списке файлов. Первые два элемента списка должны быть числовыми значениями времени доступа и изменения соответственно. Возвращает количество успешно изменённых файлов. Время изменения inode каждого файла устанавливается на текущее время. Например, этот код имеет тот же эффект, что и команда Unix touch(1), когда файлы уже существуют и принадлежат пользователю, выполняющему программу:
#!/usr/bin/perl my $atime = my $mtime = time; utime $atime, $mtime, @ARGV;Начиная с Perl 5.8.0, если первые два элемента списка являются
undef, вызывается системный вызов utime(2) вашей библиотеки C с нулевым вторым аргументом. В большинстве систем это установит время доступа и изменения файла на текущее время (т.е., эквивалентно примеру выше) и будет работать даже с файлами, которые вам не принадлежат, если у вас есть права записи:for my $file (@ARGV) { utime(undef, undef, $file) || warn "Couldn't touch $file: $!"; }В NFS это будет использовать время сервера NFS, а не время локальной машины. Если есть проблема с синхронизацией времени, у сервера NFS и локальной машины будут разные значения. Команда Unix touch(1) фактически обычно использует этот формат вместо показанного в первом примере.
Передача только одного из первых двух элементов как
undefэквивалентна передаче 0 и не будет иметь описанного эффекта, когда оба являютсяundef. Это также вызывает предупреждение об отсутствии инициализации.На системах, поддерживающих futimes(2), вы можете передавать дескрипторы файлов среди файлов. На системах, не поддерживающих futimes(2), передача дескрипторов файлов вызывает исключение. Дескрипторы файлов должны передаваться в виде глобов или ссылок на глобы, чтобы быть распознанными; простые слова считаются именами файлов.
Вопросы переносимости: "utime" в perlport.
- values HASH
- values ARRAY
-
В контексте списка возвращает список, содержащий все значения именованного хэша. В Perl 5.12 и более поздних версиях также вернёт список значений массива; до выпуска этой версии попытка использовать массив в качестве аргумента приведёт к синтаксической ошибке. В скалярном контексте возвращает количество значений.
Элементы хэша возвращаются в, казалось бы, случайном порядке. Фактический случайный порядок специфичен для данного хэша; совершенно одинаковые серии операций на двух хэшах могут привести к разному порядку для каждого хэша. Любая вставка в хэш может изменить порядок, как и любое удаление, за исключением того, что последний ключ, возвращённый
eachилиkeys, может быть удалён без изменения порядка. До тех пор, пока хэш не изменяется, вы можете полагаться наkeys,valuesиeach, чтобы они последовательно возвращали один и тот же порядок друг друга. См. "Algorithmic Complexity Attacks" в perlsec для получения подробной информации о том, почему порядок хэшей случайный. Помимо гарантий, указанных здесь, точные детали алгоритма хэшей Perl и порядок обхода хэшей могут быть изменены в любой версии Perl. Связанные хэши могут вести себя иначе, чем хэши Perl, в отношении изменений порядка при вставке и удалении элементов.Как побочный эффект, вызов
valuesсбрасывает внутренний итератор хэша или массива (см.each) перед выдачей значений. В частности, вызовvaluesв контексте «ничего» сбрасывает итератор без дополнительной нагрузки.Помимо сброса итератора,
values @arrayв контексте списка эквивалентен простому@array. (Мы рекомендуем использовать контекст «ничего»keys @array, но посчитали, что удалениеvalues @arrayпотребует больше документации, чем его оставление.)Обратите внимание, что значения не копируются, что означает, что их изменение повлияет на содержимое хэша:
for (values %hash) { s/foo/bar/g } # modifies %hash values for (@hash{keys %hash}) { s/foo/bar/g } # sameНачиная с Perl 5.14, экспериментальная функция позволяла
valuesпринимать скалярное выражение. Этот эксперимент признан неудачным и был удалён в Perl 5.24.Чтобы избежать путаницы у потенциальных пользователей вашего кода, работающих со старыми версиями Perl, с таинственными синтаксическими ошибками, поместите это в начало вашего файла, чтобы указать, что ваш код будет работать только с Perl недавних версий:
use v5.12; # so keys/values/each work on arrays - vec EXPR,OFFSET,BITS
-
Рассматривает строку в EXPR как битовую последовательность, состоящую из элементов шириной BITS, и возвращает значение элемента, указанного OFFSET, как целое число без знака. BITS, следовательно, определяет количество битов, зарезервированных для каждого элемента в битовой последовательности. Это должно быть степень двойки от 1 до 32 (или 64, если ваша платформа поддерживает это).
Если BITS равно 8, «элементы» совпадают с байтами входной строки.
Если BITS равно 16 или более, байты входной строки группируются в блоки размером BITS/8, и каждый блок преобразуется в число так же, как с
pack/unpackс форматами с big-endiann/N(и аналогично для BITS==64). См.packдля получения подробной информации.Если bits равно 4 или меньше, строка разбивается на байты, а затем биты каждого байта разбиваются на группы 8/BITS. Бит в байте нумеруются похожим на little-endian способом, как в
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80. Например, разбиение единственного входного байтаchr(0x36)на две группы даёт список(0x6, 0x3); разбиение на 4 группы даёт(0x2, 0x1, 0x3, 0x0).vecтакже может быть присвоено, в таком случае для правильного приоритета выражения нужны скобки, как вvec($image, $max_x * $x + $y, 8) = 3;Если выбранный элемент находится вне строки, возвращается значение 0. Если элементу вне конца строки присваивается значение, Perl сначала дополнит строку достаточным количеством нулевых байтов. Ошибка возникает при попытке записи вне начала строки (т. е. отрицательного OFFSET).
Если строка закодирована в UTF-8 (и, следовательно, флаг UTF8 установлен),
vecпытается преобразовать её в использование однобайтовой внутренней кодировки на символ. Однако, если строка содержит символы со значениями 256 или выше, произойдёт критическая ошибка.Строки, созданные с помощью
vec, также можно манипулировать логическими операторами|,&,^, и~. Эти операторы будут предполагать желательность операции над битовой последовательностью, когда оба операнда — строки. См. "Bitwise String Operators" в perlop.Следующий код построит ASCII-строку, отображающую
'PerlPerlPerl'. Комментарии показывают строку после каждой операции. Обратите внимание, что этот код работает одинаково на машинах с big-endian или little-endian архитектурой.my $foo = ''; vec($foo, 0, 32) = 0x5065726C; # 'Perl' # $foo eq "Perl" eq "\x50\x65\x72\x6C", 32 bits print vec($foo, 0, 8); # prints 80 == 0x50 == ord('P') vec($foo, 2, 16) = 0x5065; # 'PerlPe' vec($foo, 3, 16) = 0x726C; # 'PerlPerl' vec($foo, 8, 8) = 0x50; # 'PerlPerlP' vec($foo, 9, 8) = 0x65; # 'PerlPerlPe' vec($foo, 20, 4) = 2; # 'PerlPerlPe' . "\x02" vec($foo, 21, 4) = 7; # 'PerlPerlPer' # 'r' is "\x72" vec($foo, 45, 2) = 3; # 'PerlPerlPer' . "\x0c" vec($foo, 93, 1) = 1; # 'PerlPerlPer' . "\x2c" vec($foo, 94, 1) = 1; # 'PerlPerlPerl' # 'l' is "\x6c"Для преобразования битовой последовательности в строку или список нулей и единиц используйте эти:
my $bits = unpack("b*", $vector); my @bits = split(//, unpack("b*", $vector));Если вам известна точная длина в битах, её можно использовать вместо
*.Вот пример, чтобы проиллюстрировать, как биты фактически располагаются:
#!/usr/bin/perl -wl print <<'EOT'; 0 1 2 3 unpack("V",$_) 01234567890123456789012345678901 ------------------------------------------------------------------ EOT for $w (0..3) { $width = 2**$w; for ($shift=0; $shift < $width; ++$shift) { for ($off=0; $off < 32/$width; ++$off) { $str = pack("B*", "0"x32); $bits = (1<<$shift); vec($str, $off, $width) = $bits; $res = unpack("b*",$str); $val = unpack("V", $str); write; } } } format STDOUT = vec($_,@#,@#) = @<< == @######### @>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> $off, $width, $bits, $val, $res . __END__Независимо от архитектуры машины, на которой выполняется программа, пример выше должен вывести следующую таблицу:
0 1 2 3 unpack("V",$_) 01234567890123456789012345678901 ------------------------------------------------------------------ vec($_, 0, 1) = 1 == 1 10000000000000000000000000000000 vec($_, 1, 1) = 1 == 2 01000000000000000000000000000000 vec($_, 2, 1) = 1 == 4 00100000000000000000000000000000 vec($_, 3, 1) = 1 == 8 00010000000000000000000000000000 vec($_, 4, 1) = 1 == 16 00001000000000000000000000000000 vec($_, 5, 1) = 1 == 32 00000100000000000000000000000000 vec($_, 6, 1) = 1 == 64 00000010000000000000000000000000 vec($_, 7, 1) = 1 == 128 00000001000000000000000000000000 vec($_, 8, 1) = 1 == 256 00000000100000000000000000000000 vec($_, 9, 1) = 1 == 512 00000000010000000000000000000000 vec($_,10, 1) = 1 == 1024 00000000001000000000000000000000 vec($_,11, 1) = 1 == 2048 00000000000100000000000000000000 vec($_,12, 1) = 1 == 4096 00000000000010000000000000000000 vec($_,13, 1) = 1 == 8192 00000000000001000000000000000000 vec($_,14, 1) = 1 == 16384 00000000000000100000000000000000 vec($_,15, 1) = 1 == 32768 00000000000000010000000000000000 vec($_,16, 1) = 1 == 65536 00000000000000001000000000000000 vec($_,17, 1) = 1 == 131072 00000000000000000100000000000000 vec($_,18, 1) = 1 == 262144 00000000000000000010000000000000 vec($_,19, 1) = 1 == 524288 00000000000000000001000000000000 vec($_,20, 1) = 1 == 1048576 00000000000000000000100000000000 vec($_,21, 1) = 1 == 2097152 00000000000000000000010000000000 vec($_,22, 1) = 1 == 4194304 00000000000000000000001000000000 vec($_,23, 1) = 1 == 8388608 00000000000000000000000100000000 vec($_,24, 1) = 1 == 16777216 00000000000000000000000010000000 vec($_,25, 1) = 1 == 33554432 00000000000000000000000001000000 vec($_,26, 1) = 1 == 67108864 00000000000000000000000000100000 vec($_,27, 1) = 1 == 134217728 00000000000000000000000000010000 vec($_,28, 1) = 1 == 268435456 00000000000000000000000000001000 vec($_,29, 1) = 1 == 536870912 00000000000000000000000000000100 vec($_,30, 1) = 1 == 1073741824 00000000000000000000000000000010 vec($_,31, 1) = 1 == 2147483648 00000000000000000000000000000001 vec($_, 0, 2) = 1 == 1 10000000000000000000000000000000 vec($_, 1, 2) = 1 == 4 00100000000000000000000000000000 vec($_, 2, 2) = 1 == 16 00001000000000000000000000000000 vec($_, 3, 2) = 1 == 64 00000010000000000000000000000000 vec($_, 4, 2) = 1 == 256 00000000100000000000000000000000 vec($_, 5, 2) = 1 == 1024 00000000001000000000000000000000 vec($_, 6, 2) = 1 == 4096 00000000000010000000000000000000 vec($_, 7, 2) = 1 == 16384 00000000000000100000000000000000 vec($_, 8, 2) = 1 == 65536 00000000000000001000000000000000 vec($_, 9, 2) = 1 == 262144 00000000000000000010000000000000 vec($_,10, 2) = 1 == 1048576 00000000000000000000100000000000 vec($_,11, 2) = 1 == 4194304 00000000000000000000001000000000 vec($_,12, 2) = 1 == 16777216 00000000000000000000000010000000 vec($_,13, 2) = 1 == 67108864 00000000000000000000000000100000 vec($_,14, 2) = 1 == 268435456 00000000000000000000000000001000 vec($_,15, 2) = 1 == 1073741824 00000000000000000000000000000010 vec($_, 0, 2) = 2 == 2 01000000000000000000000000000000 vec($_, 1, 2) = 2 == 8 00010000000000000000000000000000 vec($_, 2, 2) = 2 == 32 00000100000000000000000000000000 vec($_, 3, 2) = 2 == 128 00000001000000000000000000000000 vec($_, 4, 2) = 2 == 512 00000000010000000000000000000000 vec($_, 5, 2) = 2 == 2048 00000000000100000000000000000000 vec($_, 6, 2) = 2 == 8192 00000000000001000000000000000000 vec($_, 7, 2) = 2 == 32768 00000000000000010000000000000000 vec($_, 8, 2) = 2 == 131072 00000000000000000100000000000000 vec($_, 9, 2) = 2 == 524288 00000000000000000001000000000000 vec($_,10, 2) = 2 == 2097152 00000000000000000000010000000000 vec($_,11, 2) = 2 == 8388608 00000000000000000000000100000000 vec($_,12, 2) = 2 == 33554432 00000000000000000000000001000000 vec($_,13, 2) = 2 == 134217728 00000000000000000000000000010000 vec($_,14, 2) = 2 == 536870912 00000000000000000000000000000100 vec($_,15, 2) = 2 == 2147483648 00000000000000000000000000000001 vec($_, 0, 4) = 1 == 1 10000000000000000000000000000000 vec($_, 1, 4) = 1 == 16 00001000000000000000000000000000 vec($_, 2, 4) = 1 == 256 00000000100000000000000000000000 vec($_, 3, 4) = 1 == 4096 00000000000010000000000000000000 vec($_, 4, 4) = 1 == 65536 00000000000000001000000000000000 vec($_, 5, 4) = 1 == 1048576 00000000000000000000100000000000 vec($_, 6, 4) = 1 == 16777216 00000000000000000000000010000000 vec($_, 7, 4) = 1 == 268435456 00000000000000000000000000001000 vec($_, 0, 4) = 2 == 2 01000000000000000000000000000000 vec($_, 1, 4) = 2 == 32 00000100000000000000000000000000 vec($_, 2, 4) = 2 == 512 00000000010000000000000000000000 vec($_, 3, 4) = 2 == 8192 00000000000001000000000000000000 vec($_, 4, 4) = 2 == 131072 00000000000000000100000000000000 vec($_, 5, 4) = 2 == 2097152 00000000000000000000010000000000 vec($_, 6, 4) = 2 == 33554432 00000000000000000000000001000000 vec($_, 7, 4) = 2 == 536870912 00000000000000000000000000000100 vec($_, 0, 4) = 4 == 4 00100000000000000000000000000000 vec($_, 1, 4) = 4 == 64 00000010000000000000000000000000 vec($_, 2, 4) = 4 == 1024 00000000001000000000000000000000 vec($_, 3, 4) = 4 == 16384 00000000000000100000000000000000 vec($_, 4, 4) = 4 == 262144 00000000000000000010000000000000 vec($_, 5, 4) = 4 == 4194304 00000000000000000000001000000000 vec($_, 6, 4) = 4 == 67108864 00000000000000000000000000100000 vec($_, 7, 4) = 4 == 1073741824 00000000000000000000000000000010 vec($_, 0, 4) = 8 == 8 00010000000000000000000000000000 vec($_, 1, 4) = 8 == 128 00000001000000000000000000000000 vec($_, 2, 4) = 8 == 2048 00000000000100000000000000000000 vec($_, 3, 4) = 8 == 32768 00000000000000010000000000000000 vec($_, 4, 4) = 8 == 524288 00000000000000000001000000000000 vec($_, 5, 4) = 8 == 8388608 00000000000000000000000100000000 vec($_, 6, 4) = 8 == 134217728 00000000000000000000000000010000 vec($_, 7, 4) = 8 == 2147483648 00000000000000000000000000000001 vec($_, 0, 8) = 1 == 1 10000000000000000000000000000000 vec($_, 1, 8) = 1 == 256 00000000100000000000000000000000 vec($_, 2, 8) = 1 == 65536 00000000000000001000000000000000 vec($_, 3, 8) = 1 == 16777216 00000000000000000000000010000000 vec($_, 0, 8) = 2 == 2 01000000000000000000000000000000 vec($_, 1, 8) = 2 == 512 00000000010000000000000000000000 vec($_, 2, 8) = 2 == 131072 00000000000000000100000000000000 vec($_, 3, 8) = 2 == 33554432 00000000000000000000000001000000 vec($_, 0, 8) = 4 == 4 00100000000000000000000000000000 vec($_, 1, 8) = 4 == 1024 00000000001000000000000000000000 vec($_, 2, 8) = 4 == 262144 00000000000000000010000000000000 vec($_, 3, 8) = 4 == 67108864 00000000000000000000000000100000 vec($_, 0, 8) = 8 == 8 00010000000000000000000000000000 vec($_, 1, 8) = 8 == 2048 00000000000100000000000000000000 vec($_, 2, 8) = 8 == 524288 00000000000000000001000000000000 vec($_, 3, 8) = 8 == 134217728 00000000000000000000000000010000 vec($_, 0, 8) = 16 == 16 00001000000000000000000000000000 vec($_, 1, 8) = 16 == 4096 00000000000010000000000000000000 vec($_, 2, 8) = 16 == 1048576 00000000000000000000100000000000 vec($_, 3, 8) = 16 == 268435456 00000000000000000000000000001000 vec($_, 0, 8) = 32 == 32 00000100000000000000000000000000 vec($_, 1, 8) = 32 == 8192 00000000000001000000000000000000 vec($_, 2, 8) = 32 == 2097152 00000000000000000000010000000000 vec($_, 3, 8) = 32 == 536870912 00000000000000000000000000000100 vec($_, 0, 8) = 64 == 64 00000010000000000000000000000000 vec($_, 1, 8) = 64 == 16384 00000000000000100000000000000000 vec($_, 2, 8) = 64 == 4194304 00000000000000000000001000000000 vec($_, 3, 8) = 64 == 1073741824 00000000000000000000000000000010 vec($_, 0, 8) = 128 == 128 00000001000000000000000000000000 vec($_, 1, 8) = 128 == 32768 00000000000000010000000000000000 vec($_, 2, 8) = 128 == 8388608 00000000000000000000000100000000 vec($_, 3, 8) = 128 == 2147483648 00000000000000000000000000000001 - wait
-
Ведёт себя как wait(2) в вашей системе: ожидает завершения дочернего процесса и возвращает pid завершенного процесса или
-1если нет дочерних процессов. Статус возвращается в$?и${^CHILD_ERROR_NATIVE}. Обратите внимание, что возвращаемое значение-1может означать, что дочерние процессы собираются автоматически, как описано в perlipc.Если вы используете
waitв своём обработчике для$SIG{CHLD}, то это может случайно ожидать завершения дочернего процесса, созданного с помощьюqxилиsystem. Подробности см. в perlipc.Проблемы совместимости: "wait" в perlport.
- waitpid PID,FLAGS
-
Ожидает завершения определённого дочернего процесса и возвращает pid завершенного процесса, или
-1если такого дочернего процесса нет. Неблокирующее ожидание (с WNOHANG в FLAGS) может вернуть 0, если есть дочерние процессы, соответствующие PID, но ни один из них ещё не завершился. Статус возвращается в$?и${^CHILD_ERROR_NATIVE}.PID со значением
0указывает на ожидание любого дочернего процесса, группа процессов которого совпадает с группой процессов текущего процесса. PID со значением меньше-1указывает на ожидание любого дочернего процесса, группа процессов которого равна -PID. PID со значением-1указывает на ожидание любого дочернего процесса.Если вы пишете
use POSIX ":sys_wait_h"; my $kid; do { $kid = waitpid(-1, WNOHANG); } while $kid > 0;или
1 while waitpid(-1, WNOHANG) > 0;то вы можете выполнить неблокирующее ожидание всех ожидающих процессов-зомби (см. "WAIT" в POSIX). Неблокирующее ожидание доступно на машинах, поддерживающих системные вызовы waitpid(2) или wait4(2). Однако ожидание конкретного PID с флагами
0реализовано везде. (Perl эмулирует системный вызов, запоминая статусы завершившихся, но ещё не обработанных Perl-скриптом процессов.)Обратите внимание, что на некоторых системах возвращаемое значение
-1может означать, что дочерние процессы собираются автоматически. См. perlipc для получения подробностей и других примеров.Проблемы совместимости: "waitpid" в perlport.
- wantarray
-
Возвращает true, если контекст текущей подпрограммы или
evalожидает список значений. Возвращает false, если контекст ожидает скаляр. Возвращает undef, если контекст ожидает отсутствие значения (пустой контекст).return unless defined wantarray; # don't bother doing more my @a = complex_calculation(); return wantarray ? @a : "@a";Результат
wantarrayне определён в главном уровне файла, вBEGIN,UNITCHECK,CHECK,INITилиENDблоке, или в методеDESTROY.Эта функция должна была называться wantlist().
- warn LIST
-
Выводит предупреждение, обычно выведенное в
STDERR.warnинтерпретирует свой операнд LIST таким же образом, какdie, но немного отличается в том, что он делает по умолчанию, когда LIST пустой или формирует пустую строку. Если он пустой, и$@уже содержит значение исключения, то это значение используется после добавления"\t...caught". Если он пустой и$@тоже пустой, то используется строка"Warning: Something's wrong".По умолчанию исключение, полученное от операнда LIST, строит и выводится в
STDERR. Это поведение можно изменить, установив обработчик$SIG{__WARN__}. Если такой обработчик существует, то сообщение не выводится автоматически; ответственность обработчика состоит в том, чтобы обработать исключение по своему усмотрению (например, преобразовать его вdie). Таким образом, большинству обработчиков необходимо организовать вывод предупреждений, с которыми они не готовы справиться, вызвавwarnснова в обработчике. Обратите внимание, что это достаточно безопасно и не приведет к бесконечной петле, так как хуки__WARN__не вызываются изнутри одного.Вы заметите, что это поведение немного отличается от поведения обработчиков
$SIG{__DIE__}(которые не подавляют текст ошибки, но вместо этого могут вызватьdieснова, чтобы изменить его).Использование обработчика
__WARN__предоставляет мощный способ подавления всех предупреждений (даже так называемых обязательных). Пример:# wipe out *all* compile-time warnings BEGIN { $SIG{'__WARN__'} = sub { warn $_[0] if $DOWARN } } my $foo = 10; my $foo = 20; # no warning about duplicate my $foo, # but hey, you asked for it! # no compile-time or run-time warnings before here $DOWARN = 1; # run-time warnings enabled after here warn "\$foo is alive and $foo!"; # does show upПодробности установки записей
%SIGи дополнительные примеры см. в perlvar. Для других типов предупреждений используйте модуль Carp и его функцииcarpиcluck. - write FILEHANDLE
- write EXPR
- write
-
Записывает отформатированную запись (возможно, многострочную) в указанный FILEHANDLE, используя формат, связанный с этим файлом. По умолчанию формат файла — имя файлового дескриптора, но формат текущего выходного канала (см. функцию
select) может быть явно задан путём присваивания имени формата переменной$~.Обработка верхней части формы обрабатывается автоматически: если на текущей странице недостаточно места для форматированной записи, страница переносится путём записи символа перевода страницы и используется специальный формат верхней части страницы для форматирования нового заголовка страницы перед записью записи. По умолчанию формат верхней части страницы — имя файлового дескриптора со строкой
_TOPв конце илиtopв текущем пакете, если предыдущий не существует. Это было бы проблемой с автоматическими файловыми дескрипторами, но это можно динамически установить на формат по вашему выбору путём присваивания имени переменной$^во время выбора этого файлового дескриптора. Число строк, оставшихся на текущей странице, находится в переменной$-, которая может быть установлена на0для принудительного создания новой страницы.Если FILEHANDLE не указан, вывод направляется на текущий канал вывода по умолчанию, который изначально является STDOUT, но может быть изменён оператором
select. Если FILEHANDLE — EXPR, то выражение вычисляется, и полученная строка используется для поиска имени FILEHANDLE во время выполнения. Подробнее о форматах см. perlform.Обратите внимание, что write — это не противоположность
read. К сожалению. - y///
-
Оператор транслитерации. То же, что и
tr///. См. "Операторы-квадратные скобки" в perlop.
Нефункциональные ключевые слова по перекрёстной ссылке
perldata
- __DATA__
- __END__
-
Эти ключевые слова описаны в "Специальные литералы" в perldata.
perlmod
- BEGIN
- CHECK
- END
- INIT
- UNITCHECK
-
Эти ключевые слова фазы компиляции описаны в "BEGIN, UNITCHECK, CHECK, INIT и END" в perlmod.
perlobj
- DESTROY
-
Это ключевое слово метода описано в "Деструкторы" в perlobj.
perlop
- and
- cmp
- eq
- ge
- gt
- isa
- le
- lt
- ne
- not
- or
- x
- xor
-
Эти операторы описаны в perlop.
perlsub
- AUTOLOAD
-
Это ключевое слово описано в "Автозагрузка" в perlsub.
perlsyn
- else
- elsif
- for
- foreach
- if
- unless
- until
- while
-
Эти ключевые слова управления потоком описаны в "Составные операторы" в perlsyn.
- elseif
-
Ключевое слово «else if» пишется как
elsifв Perl. Нет ниelif, ниelse if. Он парситelseif, но только для того, чтобы предупредить вас о том, что его не следует использовать.См. документацию по ключевым словам управления потоком в "Составные операторы" в perlsyn.
- default
- given
- when
-
Эти ключевые слова управления потоком, связанные с экспериментальной функцией переключателя, описаны в "Операторы переключения" в perlsyn.
- try
- catch
- finally
-
Эти ключевые слова управления потоком, связанные с экспериментальной
tryфункцией, описаны в "Обработка исключений try-catch" в perlsyn.
- defer
-
Это ключевое слово управления потоком, связанное с экспериментальной
deferфункцией, описано в "Блоки defer" в perlsyn.
- ADJUST
-
Этот блок фазы, относящийся к классам, описан в perlclass.
© 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/perlfunc