|
|
|
---|
Содержание
#! /usr/local/bin/perl -w # запуск с ключом печати ошибок. use Oraperl; # подключение модуля для работы с Oracle $system_id = 'T:bdhost.somwere.com:Base'; # описание имени базы данных $lda = &ora_login($system_id, 'scott','tiger'); # подключение к базе данных пользователя # scott с паролем tiger $statement = 'create table MYTABLE (NAME char(10), TITLE char(20), ORGANIZATION varchar2(256))'; # SQL команда создания таблицы MYTABLE $csr = &ora_open($lda, $statement) || die $ora_errstr; # открытие курсора csr, если это невозможно, # то осуществляется выход и печать сообщения об ошибке. &ora_close($csr); # закрытие курсора open(FL, '/home/my_home_directory/my_file') || die "Can't open file \n"; # открытие файла, если это невозможно, # то выход с печатью сообщения об ошибке while ($string = <FL>) { # чтение входного потока из файла с дескриптором FL @array = split(/\//,$string); # считанная строка разбивается в массив # строк, разделителем служит слеш $st = 'insert into MYTABLE values(:1,:2,:3)'; # SQL команда помещения в таблицу некоторых значений $csr = &ora_open($lda,$st) || $ora_errstr; # открытие курсора или печать # сообщения об ошибке и выход &ora_bind($csr,$array[0],$array[1],$array[2]); # привязка значений переменных к величинам, которые # требуется поместить в таблицу &ora_close($csr); # закрытие курсора } close FL; # закрытие файла &ora_commit($lda); # завершение транзакции в базе данных &ora_logoff($lda); # отключение от базы данных
$
, даже в том случае, когда мы
обращаемся к элементу массива.
$day простая переменная day $day[28] 29 элемент массива day $day{'Feb'} значение 'Feb' из хэша %day $#day последний индекс массива @day
@
:
@day массив day - ($day[1],$day[2],...) @day[3,4,5] то же, что и @day[3..5]
%
:%day
(key1,
val1, key2, val2, ...)
FOO
, foo
и Foo
будут рассматриваться Perl-ом как разные
переменные. Имена, начинающиеся с буквы или знака подчеркивания,
могут в дальнейшем содержать в себе цифры или знаки подчеркивания.
Имена, начинающиеся с цифры, могут в дальнейшем содержать только
цифры. Имена, начинающиеся не с буквы, цифры или подчерка должны
состоять только из одного символа. Большинство таких имен
зарезервировано, например $$
является идентификатором
текущего процесса. Интерпретация команды или величины часто зависит
от требований контекста. Существует два основных контекста:
скалярный и списковый. Некоторые операции возвращают список величин
если в контексте подразумевается список и одну величину, если
контекст скалярный. Например, операция &ora_fetch
в
скалярном контексте возвращает количество выбранных строк:$nfields
= &ora_fetch($csr);
@array =
&ora_fetch($csr);
TRUE
, если он содержит не
нулевое число или не пустую строку. В Perl существует несколько
способов записи чисел:
12345 12345.67 .23E-10 0xffff шестнадцатеричная запись 0377 восьмеричная запись. 1_234_567_890 подчерк для удобства чтения.
bourne shell
-е: строка в
двойных кавычках обрабатывается и вместо переменных подставляются их
значения, а также обрабатываются бакслэш-последовательности, строки
в одинарных кавычках рассматривается просто как последовательности
символов. Используются также:
\t табуляция \n перевод строки \r возврат каретки \b пробел \e символ Escape \033 восьмеричный формат \x1b шестнадцатеричный формат \c[ управляющая последовательность (control) \a сигнал (alarm) \f переход на следующую страницу
@day =
('a','b');
$day[3] = 'c';
('a','b','c')
.@day
= ();
или, что то же самое: $#day = -1;
(@day, @month, &SomeSub)
содержит в себе элементы массива day
, за ними следуют
элементы массива month
, а за ними результат выполнения
подпрограммы SomeSub
. Пустой массив обозначается ()
.
Массив ((),(),(),())
эквивалентен пустому массиву.
Последний элемент массива может быть массивом или хэшэм:($a,
$b, @c)= split;
($a, $b, %c)= @_;
\%map = ('red',0x00f,'blue',0x0f0,'green',0xf00);
%map = ( 'red' => 0x00f, 'blue' => 0x0f0, 'green' => )xf00 );
sed
и awk
, где исполняется последовательно каждая строка.
Комментарии выделяются знаком #
, и вся строка следующая
за этим знаком будет рассматриваться как комментарий. Если вы
написали подпрограмму, то ее можно вызывать только ниже по тексту
программы. Блоком называется последовательность операторов,
логически составляющая единое целое в теле программы, как правило,
блоки заключаются в фигурные скобки. Каждая команда отделяется от
других точкой с запятой. Точка с запятой не обязательна, только если
оператор является последним в блоке.
if (EXPR)
unless
(EXPR)
while (EXPR)
until (EXPR)
В операторах while
и until
проверка
условия происходит перед выполнением тела блока, за исключением
одного случая, когда используется do-оператор:do { $_ = <STDIN>; ... } until $_ eq ".\n";
C
и Pascal
все определяется в
терминах блоков, а не операторов: то есть фигурные скобки являются
обязательными. Метка состоит из идентификатора и двоеточия. Она
ставится в начале цикла и служит указателем для операторов цикла
next
, last
и redo
(их
описание смотри ниже). Если это continue
блок, то он
выполняется перед тем, как условие будет проверено снова, как третья
часть for
оператора в C
. Правильность
условия может зависеть от результатов выполнения блока, например:
$i = 1; while ($i < 10){ ... } continue { $i++; }
for ($i = 1; $i < 10; $i++;) { ... }
$_
.
foreach \$elem(@elements) \{\$elem = \$elem * 2;\}
for ((1,2,3,4,5,6,7,8,9,10,'boom')) { print $_,"\n"; sleep(1); } for (1..15) { print "Merry Christmas\n"; } foreach $item (split(/[\/\*\\n]/,$ENV{'TERMCAP'})) { print "Item: $item\n"; }
C
, сохранили между собой ту же
иерархию, что и в C
. Термы имеют самый большой
приоритет, они содержат переменные, кавычки, выражения в скобках,
функции с их параметрами. Если за списковым оператором ( например,
print()) или унарным оператором ( например, chdir())
следует список аргументов, заключенный в скобки, то эта
последовательность имеет самый высокий приоритет, подобно функции с
аргументами. Аналогично термам обрабатываются последовательности
do{}
и eval{}
.
С
и С++
"->
"
является инфиксным оператором ссылки. Если правая часть является
[...] или {...} подпрограммой, тогда левая часть должна быть
символьной ссылкой на массив или хэш. Если правая часть - это имя
метода или скалярная переменная содержащая имя метода, то левая
часть должна быть объектом или именем класса.
С
. То есть, если они стоят перед
переменной, то они увеличивают или уменьшают переменную до
возвращения значения. Если они стоят после переменной, то увеличение
или уменьшение переменной происходит после возврата значения. Если
переменная содержит в себе число или употребляется в скалярном
контексте, то использование ++
дает обычное увеличение
значения. Если же переменная употреблялась только в строковом
контексте, не является пустой строкой и содержит символы
a-z,A-Z,0..9
, то происходит строковое увеличение
значения переменной: 100
a1
Ba
aaa
**
является экспоненциальным
оператором. Он требует к себе даже больше внимания, чем унарный
минус: -2**4
это -(2**4)
, но не (-2)**4
.
!
означает логическое отрицание. Унарный минус, в случае числового
значения переменной, обозначает обычное арифметическое отрицание.
Если операндом является идентификатор, то возвращается строка,
состоящая из знака минус и идентификатора. Если строка начинается со
знака +
или -
, то возвращается строка,
начинающаяся с противоположного знака. Унарная тильда "~
"
обозначает побитовое отрицание.rand (10) * 20; - (rand10) * 20; rand +(10) * 20; - rand(10 * 20);
~
"связывает
выражение слева с определенным шаблоном. Некоторые операторы
обрабатывают и модифицируют переменную $_
. Эти же
операции иногда желательно бывает выполнить над другой переменной.
Правый аргумент это образец поиска, подстановки или трансляции,
левый аргумент - это то, что должно быть подставлено вместо $_
.
Возвращаемая величина показывает успех операции. Бинарное "!~
"
это тоже самое, что и "=~
", только
возвращаемая величина является отрицательной в логическом смысле.
*
- умножение двух чисел. Cлэш /
- деление числа на число. Процент %
- вычисляет модуль
двух чисел, x
- оператор повторения. В скалярном
контексте возвращает строку, состоящую из многократно повторенного
левого операнда, причем повторяется он то количество раз, которое
стоит справа. В списковом контексте он многократно повторяет список.
print 'a' x 80; напечатает букву a
80
раз.lt
и gt
влияют установки
системного языка, если операционная система способна работать с
несколькими языками. По этой причине операторы должны корректно
работать со строками на языках, отличных от US ASCII
,
что в системе UNIX
задается указанием свойств
LC_COLLATE
системного locale
.
==
возвращает TRUE
, если левый аргумент
численно эквивалентен правому.!=
возвращает TRUE
,
если левый аргумент численно неэквивалентен правому.eq
возвращает
TRUE
, если левый аргумент эквивалентен правому (в
строковом контексте).ne
возвращает TRUE
,
если левый аргумент неэквивалентен правому (в строковом
контексте).cmp
возвращает -1, 0 или 1 в зависимости
от того, меньше равен или больше левый аргумент правого (в строковом
контексте).&
возвращает объединенные побитово
операнды. ^
возвращает исключенные побитово
операнды.
&&
- логическое И. Если левый аргумент FALSE
, то правый не
проверяется. TRUE
, то правый аргумент не проверяется. && отличаются от подобных операторов в \verb
C|
тем, что вместо 0 или 1 они возвращают последнюю обработанную
величину. Таким образом, наиболее удобным способом определить
домашний каталог пользователя из переменной окружения HOME
будет (на практике такой способ определения домашнего каталога
пользователя не рекомендуется):
$home = $ENV{'HOME'} || $ENV{'LOGDIR'} || (getpwuid($<))[7] || die "You're homeless!\n";
and
и or
, которые будут описаны
далее. Их приоритет ниже, однако их можно с удобством использовать,
не расставляя скобки, после операторов, аргументами которых являются
списки:
unlink "alpha", "beta", "gamma" or gripe(), next LINE;
C
, то это может быть записано так:
unlink("alpha", "beta", "gamma") || (gripe(), next LINE);
..
- оператор диапазона. Реально это два разных оператора, в
зависимости от контекста. В списковом контексте он работает как
оператор диапазона от левого аргумента до правого.
for (1..10) { #code }
TRUE
, то ..
принимает значение
TRUE
, если правый операнд тоже TRUE
.
if (101..200) { print 'hi;)';}
?:
также как и в C
является условным оператором. Он
работает подобно if-then-else
. Если аргумент перед ?
- TRUE
, то возвращается аргумент перед :
,
в противоположном случае возвращается аргумент после :
.
Скалярный или списковый контекст второго и третьего аргументов
передается по наследству.
($a_or_b ? $a : $b) = $c;
=
- обычный оператор присваивания. Вообще операторы присваивания
работают также как и в C
. $a += 2;
- то же
самое, что и $a = $a + 2;
Можно использовать следующие
сокращения:
**= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x=
($a += 2) *= 3;
- то же
самое, что и : $a = $a + 2;
$a = $a * 3;
,
- оператор запятая или comma-оператор. В скалярном
контексте он обрабатывает левый аргумент и отбрасывает его значение,
потом обрабатывает правый аргумент и возвращает его величину. В этом
он подобен comma-оператору из C
. В списковом контексте
он играет роль разделителя аргументов и вставляет оба аргумента в
список. => является синонимом comma-оператора.
NOT
возвращает отрицание аргумента. Оно
эквивалентно !
, за исключением более низкого
приоритета.
and
возвращает конъюнкцию двух выражений. Он
эквивалентен &&
, за исключением более низкого
приоритета. or
возвращает дизъюнкцию аргументов. Он
эквивалентен ||, за исключением более низкого приоритета. xor
(eXclusive OR) - исключающее ИЛИ, возвращает истину, если истинен
ровно один из аргументов.
open(STDIN,"/etc/passwd"); while ($string = <STDIN>) { @a = split(/[:]/,$string); }
<STDIN>
принимает значение FALSE
и цикл while
завершается. По умолчанию считывание происходит в переменную $_
.
Нулевой дескриптор файла используется также как в sed
и
awk
, то есть считывается поток из файлов перечисленных
в командной строке.
s/PATTERN/REPLACEMENT/egimosx
производит поиск строки,
соответствующей шаблону PATTERN
и если строка найдена,
то подстановку на ее место текста REPLACEMENT
.
Возвращает количество произведенных подстановок. Если перед этим не
использовался оператор =~
или !~
для
определения переменной, которая будет обрабатываться, то будет
модифицироваться переменная $_
. Этот оператор
используется со следующими опциями:
$path =~ s|/usr/local/bin|/usr/bin|; ($foo = $bar) =~ s/this/that/o; $count = ($paragraf =~ s/Mister\b/Mr./gm);
tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds
Заменяет все найденные
символы из множества символов SEARCHLIST
на
соответствующие символы из множества символов REPLACEMENTLIST
.
Возвращает число символов, которые были заменены или удалены. Если
посредством операторов =~, !~
не была указана никакая
строка, то обрабатывается переменная $_
. y
является синонимом tr
. Если SEARCHLIST
заключен в скобки, то REPLACEMENTLIST
тоже заключается
в скобки, которые могут отличаться от тех, в которые заключается
шаблон, например:
tr[A-Z][a-z] tr(+-*/)/ABCD/
SEARCHLIST
на REPLACEMENTLIST
, например:
tr/a-zA-Z/ /cs;
$a = 'CCCCCCCCC'; $a =~ tr/C/D/s;
$a = 'D'
&
-
создается еще одна ссылка, так как одна уже существует в символьной
таблице.)
$varref = \$foo; $arref = @ARGV; $hashref = \%ENV; $coderef = \&handler;
$arrayref = [1,2,['a','b','c']];
$arrayref[2][1]
будет храниться значение b
.
$hashref = { 'Earth' => 'Moon', 'Jupiter' => 'Kallisto', ... };
sub
, без
определения имени подпрограммы:
$coderef = sub { print "Hello!\n" };
$bar = $$scalarref; push(@$arrayref,$filename); $$arrayref[0] = "January"; $$hashref{"key"} = "value"; &$coderef(1,2,3); $refrefref = \\\"how are you?"; print $$$$refrefref;
$
в фигурные скобки. Приведенный пример
тогда будет выглядеть таким образом:
$bar = ${$scalarref}; push(@{$arrayref},$filename); ${$arrayref}[0] = "January"; ${$hashref}{"key"} = "value"; &{$coderef}(1,2,3);
&{ $dispatch{$index} }(1,2,3);
$arrayref->[0] = "January"; $hashref->{"key"} = "value";
$array[$x]->{"foo"}->[0] = "January";
ref()
может быть использована для определения типа
объекта, на который указывает ссылка. Функция bless()
может быть использована для ассоциирования ссылки с пакетом,
функционирующим как объектный класс.
$name = "foo"; $$name = 1; - то же самое, что $foo = 1; ${$name} = 2; - то же самое, что $foo = 2; ${$name x 2 } = 3; -то же самое, что $foofoo = 3; $name->[0] = 4; -то же самое, что $foo[0] = 4; @$name = (); - обнуляет массив @foo &$name(); - вызывает &foo
/SWAP.*/
- соответствуют все слова
начинающиеся со SWAP
и заканчивающихся произвольным
набором символов. Точка обозначает произвольный символ, звездочка -
то, что символ, стоящий перед ней, входит в слово 0 и более раз. Все
метасимволы, которые будут описаны ниже, бозначают вхождение того,
что стоит перед ними./\w*/
- соответствуют слова
состоящие только из алфавитных, цифровых символов и символа подчерк.
\w
- соответствует алфавитным, цифровым символам и
символу подчерк, звездочка - тому, что эти символы могут входить
произволное количество раз. Здесь мы приведем только основные
метасимволы. Для более подробной информации смотрите соответствующие
страницы man по Perl.
* соответствует 0 или более вхождений + соответствует 1 или более вхождений ? соответствует 1 или 0 вхождений {n} соответствует ровно n вхождений {n,} соответствует по крайней мере n вхождений {n,m} соответствует по крайней мере n, но не более m вхождений
*
эквивалентен {0,}
, +
эквивалентен {1,}
и ?
эквивалентен {0,1}
.
Ограничений на величину m и n нет. Эта стандартная конструкция
работает в "жадном" режиме, то есть: регулярному выражению
a.*b
будет соответствовать всевозможный набор слов
начинающихся с символа a
и кончающихся символом b
,
в том числе слова типа abcab
. В таких словах есть
подпоследовательности символов, которые также удовлетворяют условиям
регулярного выражения. Если после каждого из описанных метасимволов
поставить знак ?
, то подобные последовательности будут
опускаться. Шаблоны обрабатываются как строка в двойных кавычках,
поэтому приведенные ниже последовательности также будут
обрабатываться:
\l - передвижение на символ вниз \u - передвижение на символ вверх
\w - соответствуют алфавитные и цифровые символы а также символ подчерк \$W - соответствуют все символы не входящие во множество символов w \s - символы пробела, табуляции, возврата каретки \S - все символы не входящие во множество символов s \d - цифровые символы \D - нецифровые символы
\w
отмечает только отдельные
символы, а не все слово. Чтобы отметить все слово нужно использовать
\w+
. Также определены следующие команды:
\b - соответствуют границы слова \B - соответствуют не-границы слова \A - соответствуют только начало строки \Z - соответствуют только конец строки
\<digit>
подставляет подстроку из скобок с номером digit
. Можно
использовать скобки для отделения подшаблона. Если в скобках имеется
более, чем 9 подстрок, то переменные $10
, $11
,
... содержат соответствующие подстроки. $+
возвращает
то, чему соответствует последняя конструкция в скобках. $&
возвращает подставленную строку. $`
возвращает все
перед подставленной строкой, $'
возвращает все после
подставленной строки.
$_ = 'abcdefghi'; /def/; print "$`:$&:$'\n"; - напечатает abc:def:ghi
manual page
.
shell
. use English;
while(<>){...}
while($_= <>) {...}
$&
, $`
, $'
и
$+
.
RS
из awk
.
OFS
в awk
.
ORS
в awk
. (Вы
можете определить $ вместо того, чтобы печатать n в конце печати.)
$,
. Но
используется при обращении к списку величин в двойных кавычках (или
другой строке, которая требует интерпретации). По умолчанию содержит
символ пробел.
$foo{$a,$b,$c}
то реально это будет происходить так:
$foo{join($;,$a,$b,$c)}
. Не путайте с @foo{$a,$b,$c}
,
так как это тоже самое, что($foo{$a},$foo{$b},$foo{$c})
.
По умолчанию содержит значение \034
такое же как
переменная SUBSEP
в awk
.
OFMT
в awk
. Первоначально содержит значение %.20g.
_TOP
eval()
.
Если содержит значение 0, то команда была исполнена корректно. Но
заметьте, что сообщения не накапливаются в этой переменной.
do EXPR
, require
и use
.
do
или
require
. Ключами являются имена файлов, а значениями
места их расположения.
sub handler { local($sig) = @_; print "Caught a SIG$sig - shutting down\n"; close(LOG); exit(0); } $SIG{'INT'} = 'handler'; $SIG{'QUIT'} = 'handler'; ... $SIG{'INT'} = 'DEFAULT'; $SIG{'QUIT'} = 'IGNORE';
accept(2)
ждет соединения. Возвращает
запакованный адрес, если соединение произошло успешно и FALSE
в противоположном случае.
arctg(Y/X)
.
bind
в OS UNIX
или любой другой системе, поддерживающей BSD Sockets
.
Если привязка произошла успешно, возвращает TRUE
, в
противном случае - FALSE
. Переменная NAME
должна содержать запакованный адрес, соответствующего для сокета
типа. Тип адреса для разных видов сокетов определяется в терминах
языка C
структурой sockaddr
, которая
представляет собой абстрактный тип, содержащий все данные,
необходимые для сокета.
REF
, к пакету PACKAGE
,
если он определен, если же он опущен, то к текущему пакету. Для
удобства возвращает ссылку, так как bless()
часто
является последним оператором в конструкторе.
TRUE
,
если мы находимся внутри подпрограммы, eval()
или
require()
. FALSE
в противоположном случае.
В списковом контексте возвращает:
($package, $filename, $line) = caller;
EXPR
возвращает более сложную информацию,
которая используется отладчиком для печати карты стека. Значение
EXPR
отмечает глубину стека до текущей записи.
($package, $filename, $line, $subroutine, $hasargs, $wantargs) = caller($i);
EXPR
, если это возможно. Если EXPR
опущено, то устанавливает в качестве текущей директории домашнюю
директорию. Возвращает TRUE
в случае успеха и FALSE
иначе.
LIST
. Первым аргументом должна быть маска
доступа в цифровом формате. Возвращает число файлов права доступа к
которым были успешно сменены.
$cnt = chmod 0700 'foo','bar'; chmod 700 @executables;
NUMBER
в наборе символов. Например, chr(65)
вернет A
.
FILEHANDLE
. Для более подробной информации читайте
manual page
.
open(OUTPUT '/usr/home/petrov'); ... close OUTPUT;
opendir()
.
TRUE
в случае успешного соединения и FALSE
в противоположном
случае. Переменная NAME
должна содержать запакованный
адрес соответствующего данному сокету типа.
EXPR
,
выраженного в радианах. Если EXPR
опущено, возвращает
косинус $_
.
dbm(3)
или ndbm(3)
файл с ассоциативным массивом. ASSOC
- имя ассоциативного массива. DBNAME
- имя базы данных
(без .dir или .pag
расширения). Если база данных не
существует, то она создается с правами доступа указанными в MODE
.
dbmopen(%HIST,'/usr/lib/news/history', 0600); while (($key, $val) = each %HIST){ print $key, '=', unpack('L',$val),\n;} dbmclose(%HIST);
TRUE
или
FALSE
, в зависимости от того определено значение EXPR
или нет. Многие операции возвращают неопределенное значение в случае
конца файла, неинициализированной переменной, системной ошибки или
при подобной ситуации. Если речь идет о хэше, то defined покажет
только определены ли ли величины, ничего не говоря о существовании
ключей. Для определения существования ключей используется функция
exists()
.
foreach $key (keys %array) { delete $array{$key}; }
undef()
.
eval()
печатает значение
LIST
в STDERR
и выходит из программы с
текущим значением $!
. Если значение $!
есть ноль, то принимает значение $? >> 8
. Если
значение $? >> 8
есть ноль, то принимает значение
255. Внутри eval()
сообщение об ошибке помещается в
переменную $@
и eval()
прерывается с
неопределенным значением.
open(FL, "/root/rm-rf") || die "Can't open file.\n";
EXPR
как
имя файла и далее запускает содержимое этого файла, как программу на
Perl. Обычно это используется для включения библиотечных
подпрограмм.
do 'stat.pl';
eval 'cat stat.pl';
use
и require
.
($key, $value)
.
while (($key,$value) = each %ENV){ print " $key = $value \n"; }
FILEHANDLE
не был открыт. При опущении аргумента eof
обрабатывает
последний файл, из которого происходило считывание. Но на практике
эта функция редко используется, так как в Perl-е операторы чтения
возвращают неопределенное значение в конце файла.
EXPR
выполняется как
маленькая программа в контексте основной программы. Определенные
переменные и подпрограммы остаются определенными и в дальнейшем.
Возвращается значение, которое возникает при обработке последнего
выражения. Если EXPR
опущено, то обрабатывается $_
.
UNIX
)
производится системный вызов семейства exec
, который
подменяет программу, исполняющуюся в рамках текущего процесса. Если
LIST
представляет собой список из более, чем одного
аргумента, то вызывается execvp(3)
с аргументами из
LIST
. Если аргумент только один, то он проверяется на
метасимволы shell
. Если они присутствуют, то он далее
передается /bin/sh -c
для обработки. Если же их нет, то
аргумент передается напрямую execvp
, который более
эффективен.
TRUE
, если в
хэше есть ключи и даже в том случае, когда значения VALUE
не определены.
EXPR
и
осуществляет немедленный выход с полученной величиной.
$ans = <STDIN>; exit 0 if $ans =~ /^[Xx]/;
EXPR
опущено, то осуществляет выход с нулевым
статусом.
EXPR
. По
умолчанию обрабатывается $_
.
fork(2)
.
Возвращает pid (идентификатор процесса) дочернего процесса
родительскому процессу и 0 дочернему процессу. Значение не
определено в случае неуспешного завершения команды. Неуспех может
произойти, например, в случае установки в системе ограничения на
количество процессов данного пользователя. Вот небольшой пример
использования этой функции.
unless ($pid = fork) { unless (fork) { exec "what you really wanna do"; die "no exec"; some_perl_code_here; exit 0; } exit 0; } waitpid($pid,0);
FILEHANDLE
или пустую
строку в случае конца файла. Если FILEHANDLE
опущен, то
считывание происходит из STDIN
.
LABEL
и продолжает выполнение программы
с этой точки. Точка не может находиться внутри подпрограммы или
foreach
цикла, так как в этих случаях требуется
предварительная инициализация. Использовать в качестве LABEL
выражение не рекомендуется, хотя такая возможность и
предоставляется.
BLOCK
или
EXPR
для каждого элемента LIST
и
возвращает список элементов для которых значение выражения TRUE
.
В скалярном контексте возвращает число элементов для которых EXPR
TRUE
.
EXPR
,
интерпретируемого как шестнадцатеричная строка. По умолчанию
обрабатывает переменную $_
.
LIST
,
первым элементом списка должен быть номер сигнала. Возвращает число
процессов, которым сигнал был послан успешно. В отличие от shell
,
если номер сигнала отрицателен, то он посылается группе процессов.
EXPR
,
если EXPR
опущено, то обрабатывает переменную $_
.
LIST
. При этом в качестве разделителей между элементами
LIST
ставит значение EXPR
. Например:
$_ = join( ':',$login,$passwd, $uid,$gid,$gcos,$home,$shell);
ASSOC_ARRAY
.
В скалярном контексте возвращает число ключей.
@keys = keys %ENV;
EXPR
в
символах. По умолчанию обрабатывает переменную $_
.
NEWFILE
,
присоединенный к файлу OLDFILE
. (В OS UNIX
создание нескольких имен для одного файла) Возвращает 1 в случае
успеха и 0 иначе.
TRUE
в случае
успеха, FALSE
иначе.
my
. Функция local
делает перечисленные переменные локальными в блоке, подпрограмме,
eval
или do
. Если переменных более, чем
одна, то они должны объединяться скобками.
sub RANGEVAL{ local($min,$max,$thunk) = @_; local $result = "; local $i; for ($i = $min; $i < $max; $i++) { $result = eval $thunk; } $result; }
EXPR
,
по умолчанию обрабатывает переменную $_
.
LIST
в EXPR
(которое может быть блоком) и
возвращает список полученных после обработки величин.
@chars = map(chr, @nums);
FILENAME
и правами доступа указанными в переменной
MODE
. В случае успеха возвращает 1, в противном случае
возвращает 0 и устанавливает значение переменной $!(errno)
.
local
) делает перечисленные переменные
локальными в пределах блока, подпрограммы, eval или do. Если список
состоит более чем из одного элемента, то он должен быть заключен в
скобки. Все элементы в списке должны быть фактическими параметрами.
В отличие от local, переменные локализованные функцией my
не видны снаружи блока, подпрограммы или другой конструкции, внутри
которой my
употребляется.
C
- запускает следующую итерацию цикла.
line: while (<STDIN>) { next line if /^#/; ... }
EXPR
,
интерпретируемого как строка в восьмеричном формате. (Если строка
начинается с 0x
, то интерпретируется, как строка в
шестнадцатеричном формате.)
EXPR
и привязывает его к
FILEHANDLE
. Если EXPR
опущено, то
переменная с таким же именем как FILEHANDLE
содержит
имя файла. Если имя файла начинается со знака:
< файл открывается на чтение. > файл открывается на запись. >> файл открывается для добавления. | имя файла расценивается как команда, с которой будет организован программный канал, то есть вывод в дескриптор FILEHANDLE будет передаваться на вход программе EXPR.
|
указывается после имени команды, то вывод
этой команды будет ассоциирован с дескриптором FILEHANDLE
,
из которого будет производиться чтение. Интересно, что нельзя
открыть двойной программный канал, то есть ассоциировать ввод и
вывод команды с дескриптором файла (что соответствовало бы
системному вызову popen
в UNIX
).
popen(3)
).
open(LOG, '>>/usr/spool/news/twitlog');
EXPR
, возвращает TRUE
в случае успеха.
EXPR
. По умолчанию обрабатывает
переменную $_
.
FILEHANDLE
может быть
именем скалярной переменной, содержащей дескриптор файла. Если эта
переменная опущена то печать идет в выбранный канал вывода. Если
переменная LIST
тоже опущена, то печатает переменную $_
в STDOUT
.
print
FILEHANDLE, sprintf(LIST)
. Первый аргумент LIST
интерпретируется как формат печати.
EXPR
. EXPR
должно быть
положительным. По умолчанию производит выборку в диапазоне между 0 и
1. (Замечание: если ваша функция постоянно возвращает слишком
большие или слишком малые значения, то скорее всего была допущена
ошибка при компиляции вашей версии Perl. Было установлено неверное
значение RANDBITS
.)
LENGTH
байт данных из FILEHANDLE
в
переменную SCALAR
. Возвращает число считанных байт или
неопределенное значение в случае ошибки. Если вы хотите считать
данные не с начала строки, то для этого нужно установить значение
переменной OFFSET
.
$!
. По умолчанию
обрабатывает переменную $_
.
LABEL
опущена, то команда выполняется для внутреннего
цикла.
line: while(<STDIN>) { while ($_ ne '\') { if (ord $_ < 86) { ... } redo line; } print; }
TRUE
, если EXPR
является ссылкой и FALSE
в противоположном случае.
Полученное значение зависит от типа объекта на который указывает
ссылка. Существует несколько встроенных типов данных:
package
), то в таком случае
возвращается имя пакета.
if (ref($r) eq "HASH") { print " Это ссылка на ассоциативный массив.\n"; } if (!ref($r)) { print " А это не ссылка вовсе! \n";
require "oraperl.pm";
continue
блоке в конце цикла для переустановки значений переменных. EXPR
интерпретируется как список отдельных символов. Значения переменных
и массивов, имена которых начинаются с одного из этих символов
списка переустанавливаются. Например:
reset 'X' переустановит все X переменные reset 'a-z' переустановит все переменные, имена которых состоят из маленьких букв.
$!
. По умолчанию
обрабатывает аргумент $_
.
EXPR
.
FILEHANDLE
,
на позицию POSITION
в режиме, указанном в переменной
WHENCE
. Если переменная WHENCE
содержит
значение 0, то позиция отсчитывается от начала файла, если 1 то от
текущей позиции и если 2, то от конца файла. Возвращает 1 в случае
успеха и 0 иначе.
FILEHANDLE
. Направляет вывод в FILEHANDLE
.
select(2)
с определенной аргументами битовой
маской.
ARRAY
влево с удалением первого элемента и возвращает удаленный элемент.
Если в массиве нет элементов, то возвращает неопределенное значение.
Если ARRAY
опущен, то обрабатывает массив @ARGV
в главной программе и массив @_
в подпрограммах.
EXPR
(выраженного в радианах). Если аргумент опущен, то обрабатывается
переменная $_
.
EXPR
секунд. Если аргумент опущен, то процесс зависает навсегда. В таком
случае "сон" можно прервать, послав ему сигнал. Возвращает
число секунд, в течение которых процесс был в состоянии остановки.
SOCKET
. Остальные
параметры описываются так же, как и в одноименном системном вызове.
В начале программы необходимо написать use Socket;
.
LIST
и возвращает отсортированный список. Если список является массивом,
то несуществующие элементы массива не учитываются и не возвращаются.
Ниже приведено несколько примеров.
@articles = sort @files;
@articles = sort{$a cmp $b} @files;
@articles = sort{$a <=> $b} @files;
ARRAY
элементы, отмеченные в переменных OFFSET
и LENGTH
и заменяет их элементами списка LIST
,
если таковые имеются. Возвращает удаленные из массива элементы.
Длина массива растет или уменьшается, если это необходимо. Если
переменная LENGTH
опущена, то удаляет все, начиная с
OFFSET
.
@_
.
Если EXPR
опущено то разбивается строка $_
.
Если PATTERN
тоже опущен, то разбиение происходит по
символу пробел. Символы, указанные в PATTERN
, служат
разделителями для полей. Разделители могут быть длиннее, чем один
символ. Если переменная LIMIT
задана и имеет
неотрицательное значение, то разбиение будет происходить на число
полей не более указанного в LIMIT
. Если переменная не
определена, то пустые поля отбрасываются, если имеет отрицательное
значение, то это интерпретируется Perl-ом, как отсутствие
ограничения на длину возвращаемого массива. Если шаблону
соответствует пустая строка, то EXPR
будет разбито на
отдельные символы. Например:
print join(':',split(/ */,'hi there'));
h:i:t:h:e:r:e
.
EXPR
. По умолчанию обрабатывает переменную $_
.
LIST
, за одним исключением: вместо того, чтобы просто
начать выполнять программу , как это делает exec, system
делает fork
и порождает еще один процесс, причем
родительский процесс ждет завершения дочернего.
FILEHANDLE
. Если аргумент опущен, то
обрабатывает файл, который читался последним.
VARIABLE
содержит имя
переменной, переменная PACKAGENAME
содержит имя пакета.
Дополнительные аргументы передаются методу new
этого
пакета. Обычно это такие аргументы, которые в дальнейшем могут быть
переданы в качестве параметров dbm_open()
функции из C
.
tie(%HIST, NDBM_File,'/usr/lib/news/history', 1, 0); while(($key,$val) = each %HIST) { print $key, '= ', unpack('L',$val),"\n"; } untie(%HIST);
TIEHASH objectname, LIST
DESTROY
this
FETCH this, key
STORE this,
key, value
DELETE this, key
EXISTS
this, key
FIRSTKEY this
NEXTKEY
this, lastkey
TIEARRAY objectname, LIST
DESTROY this
FETCH this, key
STORE
this, key, value
TIESCALAR objectname, LIST
DESTROY this
FETCH this
STORE
this, value
EXPR
неопределенной величиной, в случае, когда аргумент опущен ничего не
меняет. Не следует пытаться применять эту функцию к
зарезервированным переменным, потому что результат может оказаться
непредсказуемым.
rmdir
.
shift
. Присоединяет
LIST
к началу массива ARRAY
и возвращает
новое количество элементов в массиве.
use strict qw(subs,vars,refs);
ASSOC_ARRAY
.
В скалярном контексте возвращает число элементов полученного
массива. Элементы массива могут располагаться в произвольном
порядке.
TRUE
, если
контекст исполняющейся подпрограммы списковый, FALSE
в
противоположном случае.
$~{ }
имени формата.
sub NAME;
- подразумевает описание в дальнейшем тела
подпрограммы.
sub NAME BLOCK
- непосредственное описание.
$subref = sub BLOCK
- анонимное описание.
use PACKAGE qw(NAME1, NAME2, NAME3)
- включение
подпрограмм из модулей.
&NAME(LIST)
- скобки обязательны для &
формы.
NAME(LIST)
- &
не обязательно со
скобками.
NAME LIST
- скобки можно опустить в случае
предварительного описания или включения подпрограммы из модуля.
@_
, его элементы являются
ссылками на реальные скалярные параметры. Подпрограмма возвращает
значение, полученное в результате исполнения последнего оператора
подпрограммы. Как уже говорилось, подпрограмма вызывается
использованием префикса &
перед ее именем, в Perl 5
этот префикс не обязателен. Пример:
sub MAX { my $max = pop(@_); foreach $foo (@_) { $max = $foo if $max < $foo; } $max; } ... $bestmark = &MAX(1,2,3,4,5);
&
формы, то список
аргументов необязателен. Если вы хотите создать внутри модуля его
собственную, невидимую снаружи подпрограмму, то описание должно быть
анонимным:
my $subref = sub {...} &$subref(1,2,3);
main
. Можно ссылаться на переменные или
дескрипторы файлов из других пакетов посредством использования
префикса перед именем переменной, состоящего из имени пакета и
двойного двоеточия: $Package::Variable
. Если имя пакета
нулевое, то предполагается использование переменной из main
пакета. То есть $::sail
эквивалентно $main::sail
.
Пакеты могут включать в себя другие пакеты, в таком случае чтобы
обратиться к переменной нужно применить описанное обозначение
рекурсивно: $OUTER::INNER::var
. STDIN, STDOUT, STDERR,
ARGV, ARGVOUT, ENV,
INC
и SIG
также
содержатся в главном пакете.
package mypack; sub main::mysub { ... }
%OUTER::INNER::
.
BEGIN
и END
программы в
их описании необязательно использование sub
.
Подпрограмма BEGIN
исполняется сразу, как только это
возможно, то есть в момент, когда она полностью определена, даже
перед тем как обрабатывается остаток содержащего файла. В файле
может быть несколько блоков BEGIN
. Они исполняются в
порядке определения. END
исполняется в
самом конце. В файле может содержаться несколько END
блоков, они исполняются в обратном порядке.
@ISA
.
use Module; или use Module LIST;
BEGIN { require "Module.pm"; import Module; }
.pm
.
Если именное пространство модуля пересекается с именным
пространством основной программы то всегда используется use
,
если не пересекается то можно использовать require
.
package Critter; sub new { bless {} }
{}
создает ссылку на
анонимный хэш.C++
, Perl не имеет специального синтаксиса
для описания классов. Классом является пакет, чьи подпрограммы
выступают в качестве методов. Для каждого пакета определен
специальный массив @ISA
, в котором перечислены пакеты,
подключенные к данному пакету. Таким образом в Perl реализован
механизм наследования методов. Метод, принадлежащий другому объекту,
подключается как подпрограмма.
sub find { my ($class, $name) = @_; $objtable{$name}; }
self
или this
и в дальнейшем используют ее как обычную ссылку.
sub display { my $self = shift; my @keys = @_ ? @_ : sort keys %$self; foreach $key (@keys) { print "\t$key => $self ->{$key}\n"; } }
$fred = find Critter "Fred"; display $fred, 'Height', 'Weight';
display {find Critter "Fred"} 'Height', 'Weight';
C++
) имеет фиксированное имя DESTROY
и
вызывается перед удалением объекта. В нем можно реализовать
дополнительные процедуры, необходимые для корректного завершения
(например, удаление временных файлов, используемых объектом).