Рубрики

Реклама




 

Мовні конструкції Perl


4.1 Посилання
4.1.1 Основні поняття

У попередніх версіях Perl була реалізована можливість тільки символьних посилань. Perl версії 5 і вище дозволяє використовувати не тільки символьні посилання на змінні, але і “жорсткі” посилання на будь-які дані.


Оскільки будь-який скаляр може бути посиланням, а масиви і хеши складаються з скалярів, то можна з легкістю організувати масив масивів, масив хешей, хеш масивів і так далі. “Жорсткі” посилання стежать за лічильником посилання і як тільки лічильник стає рівним нулю, автоматично видаляють посилання. Символьні посилання містять тільки ім’я змінної, також як символьне посилання файлової системи містить просто ім’я файлу. Посилання можуть бути створені декількома способами:
Використовуючи бекслеш оператора перед змінній, підпрограмою або простою константою. (Це працює майже як & - створюється ще одне посилання, оскільки одне вже існує в символьній таблиці.)
$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” };
Посилання часто повертаються конструкторами. Об’єкти Perl насправді є посиланнями на спеціальну суть, яка знає, який пакет асоціювати з об’єктом. Конструктори це спеціальні підпрограми, які уміють створювати цю асоціацію.
Щоб витягувати інформацію, на яку вказує посилання, теж існує декілька методів:
Можна зробити ідентифікатор посилання частиною імені змінної або підпрограми:
$bar = $$scalarref;
push(@$arrayref,$filename);
$$arrayref[0] = “January”;
$$hashref{”key”} = “value”;
&$coderef(1,2,3);
$refrefref = \”how are you?”;
print $$$$refrefref;
- надрукує “how are you?”.
Потрібно розуміти, що розкриття посилання має вищий пріоритет, ніж витягання значення змінної.
Можна поступити як і у попередньому випадку, але вкласти вираз після знаку $у фігурні дужки. Приведений приклад тоді виглядатиме таким чином:
$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() може бути використана для асоціювання посилання з пакетом, що функціонує як об’єктний клас.
4.1.2 Символьні посилання

Ми розглянули, що відбувається, якщо величина, використовувана як посилання, не була визначена раніше. Що ж відбувається, якщо вона вже визначена і не є жорстким посиланням? У такому разі вона обробляється як символьне посилання. Тобто значення скаляра розглядається як ім’я змінної, а не пряме посилання на змінну.
?
$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
4.2 Регулярні вирази

Perl дозволяє використовувати регулярні вирази. Для того, щоб пояснити, що ж вдає із себе регулярний вираз приведемо декілька прикладів:
/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 немає. Ця стандартна конструкція працює в “скупому” режимі, тобто: регулярному виразу а.*b відповідатиме всілякий набір слів що починаються з символу а і що кінчаються символом b, зокрема слова типу abcab. У таких словах є підпослідовності символів, які також задовольняють умовам регулярного виразу. Якщо після кожного з описаних метасимволів поставити знак ?, то подібні послідовності опускатимуться. Шаблони обробляються як рядок в подвійних лапках, тому приведені нижче послідовності також оброблятимуться:
?
\l - пересування на символ вниз
\u - пересування на символ вгору
А також всі перераховані раніше бекслеш-послідовності. У Perl-і визначені також:
?
\w - відповідають алфавітні і цифрові
символи а також символ підкреслення
\$W - відповідають всі символи що не входять
у безліч символів w
\s - символи пропуску, табуляції, повернення каретки
\S - всі символи що не входять в безліч символів
s
\d - цифрові символи
\D - нецифрові символи
Зверніть увагу, що \w відзначає тільки окремі символи, а не все слово. Щоб відзначити все слово потрібно використовувати \w+. Також визначені наступні команди:
?
\b - відповідають границі слова
\B - відповідають не-границі слова
\A - відповідають тільки початок рядка
\Z - відповідають тільки кінець рядка
При використанні конструкції типу ( … ) \ підставляє підрядок з дужок з номером digit. Можна використовувати дужки для відділення підшаблону. Якщо в дужках є більше, ніж 9 підрядків, то змінні $10, $11 … містять відповідні підрядки. $+ повертає те, чому відповідає остання конструкція в дужках. $& повертає підставлений рядок. $` повертає все перед підставленим рядком $’ повертає все після підставленого рядка.
$_ = ‘abcdefghi’;
/def/;
print “$`:$&:$’\n”; - надрукує abc:def:ghi
На цьому ми закінчимо опис регулярних виразів, для докладнішої інформації читайте manual page.
4.3 Зарезервовані змінні

У Perl є імена що мають спеціальне значення. Багато хто з них аналогічні зарезервованим іменам в shell.
Якщо ви хочете використовувати довгі імена змінних, в заголовку програми потрібно сказати:
use English;
Багато змінних доступні тільки для читання, тобто при спробі присвоєння такій змінній якого-небудь значення безпосередньо або по посиланню відбувається помилка.

$_ У цю змінну за замовчуванням відбувається введення, присвоєння, в неї складаються результати пошуку по заданому зразку.
while(<>){…}
або, що те ж саме:
while($_= <>) {…}

$ Ця змінна була описана в попередньому параграфі. Вона доступна тільки для читання, так само як і змінні $&, $`, $’ і $+.

$. Ця змінна містить номер рядка, який був почитаний останнім з файлу, який був прочитаний останнім. Вона також доступна тільки для читання.

$/ Містить символ по якому розділяються записи, що вводяться. За замовчуванням містить символ перекладу рядка. Вона схожа на змінну RS з awk.

$| За замовчуванням має значення 0. Якщо містить ненульове значення, то відбувається скидання буферів кожного разу після здійснення виведення(на друк, на екран і так далі).

$, Містить символ-роздільник полів для оператора друку. Подібна змінній 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.

$% Містить номер поточної сторінки, що виводиться.

$= Містить довжину поточної сторінки (кількість друкарських термін), зазвичай містить значення 60.

$- Містить значення, що визначає кількість рядків, що залишилися на сторінці, наприклад кількість ще не надрукованих рядків для друкарського каналу виведення.

$~ Містить ім’я поточного формату повідомлень. Звичайне ім’я дескриптора файлу.

$^ Містить ім’я поточного формату заголовка сторінки. Зазвичай містить ім’я дескриптора файлу з додаванням в кінці _TOP

$: Містить безліч символів після яких виведення терміну може бути перерваний і початий знову після перекладу рядка.

$! Якщо ця змінна використовується в числовому контексті, то містить поточне значення errno (номер помилки) зі всіма звичайними повідомленнями. У рядковому контексті містить відповідне системне повідомлення про помилку.

$@ Містить повідомлення про синтаксичну помилку, допущену під час виконання останньої команди eval(). Якщо містить значення 0, то команда була виконана коректно. Але відмітьте, що повідомлення не накопичуються в цій змінній.

$$ Містить ідентифікатор поточного процесу.

$< Містить ідентифікатор користувача (UID), якому належить поточний процес.

$> Містить ефективний UID поточного процесу.

$( Містить ідентифікатор групи (GID) користувача, якому належить поточний процес.

$) Містить ефективний GID поточного процесу.

$0 Містить ім’я файлу, в якому знаходиться виконувана програма.

$ARGV Містить ім’я поточного файлу, з якого походить читання.

@ARGV Містить масив аргументів командного рядка, які були передані програмі.

@INC Містить список точок входу в програму, в яких використовуються конструкції do EXPR, require і use.

%INC Містить входи для кожного файлу, який включається за допомогою використання операторів do або require. Ключами є імена файлів, а значеннями місця їх розташування.

%ENV Містить поточне оточення процесу. Зміною вмісту хеша можна змінити оточення породженого (дочірного) процесу.

%SIG Цей хеш використовується для установки обробників різних сигналів. Наприклад:
sub handler {
local($sig)= @_;
print “Caught а SIG$sig - shutting down\n”;
close(LOG);
exit(0);
}
$SIG{’INT’} = ‘handler’;
$SIG{’QUIT’} = ‘handler’;

$SIG{’INT’} = ‘DEFAULT’;
$SIG{’QUIT’} = ‘IGNORE’;
4.4 Вбудовані функції

abs VALUE Повертає абсолютне значення аргументу.

accept NEWSOCKET, GENERICSOCKET подібно до системного виклику accept(2) чекає з’єднання. Повертає запаковану адресу, якщо з’єднання відбулося успішно і FALSE в протилежному випадку.

atan2 Y,X Повертає arctg(Y/X).

bind SOCKET, NAME Прив’язує мережеву адресу до сокета, також як системний виклик bind в OS UNIX або будь-якій іншій системі, підтримуючою BSD Sockets. Якщо прив’язка відбулася успішно, повертає TRUE, інакше - FALSE. Змінна NAME повинна містити запаковану адресу, відповідного для сокета типу. Тип адреси для різних видів сокетів визначається в термінах мови C структурою sockaddr, яка є абстрактним типом, що містить всі дані, необхідні для сокета.

binmode FILEHANDLE Дозволяє читати або писати файл з відповідним дескриптором в бінарному режимі.

bless REF, PACKAGE Ця функція приєднує об’єкт на який вказує посилання REF, до пакету PACKAGE, якщо він визначений, якщо ж він опущений, то до поточного пакету. Для зручності повертає посилання, оскільки bless() часто є останнім оператором в конструкторі.

caller EXPR Повертає контекст поточного виклику підпрограми. У скалярному контексті повертає TRUE, якщо ми знаходимося усередині підпрограми, eval() або require(). FALSE в протилежному випадку. У списковому контексті повертає:
($package, $filename, $line) = caller;
З аргументом EXPR повертає складнішу інформацію, яка використовується відладчиком для друку карти стека. Значення EXPR відзначає глибину стека до поточного запису.
($package, $filename, $line,
$subroutine, $hasargs, $wantargs) = caller($i);

chdir EXPR Змінює поточну директорію на вказану в EXPR, якщо це можливо. Якщо EXPR опущене, то встановлює як поточну директорію домашню директорію. Повертає TRUE у разі успіху і FALSE інакше.

chmod LIST Змінює права доступу до файлів вказаним в LIST. Першим аргументом повинна бути маска доступу в цифровому форматі. Повертає число файлів права доступу до яких були успішно змінені.
$cnt = chmod 0700 ‘foo’,'bar’;
chmod 700 @executables;

chown LIST Змінює господаря або групу, якій належить список файлів. Першими двома аргументами повинні бути uid і gid. Повертає кількість успішних змін.

chr NUMBER Повертає символ, представлений номером NUMBER в наборі символів. Наприклад, chr(65) поверне A.

close FILEHANDLE Закриває файл з дескриптором FILEHANDLE. Для докладнішої інформації читайте manual page.
open(OUTPUT ‘/usr/home/petrov’);

close OUTPUT;

closedir DIRHANDLE Закриває каталог відкритий викликом opendir().

connect SOCKET,NAME Намагається з’єднатися з видаленим сокетом (по аналогії з системним викликом). Повертає TRUE у разі успішного з’єднання і FALSE в протилежному випадку. Змінна NAME повинна містити запаковану адресу відповідного даному сокету типу.

cos EXPR Повертає косинус EXPR, вираженого в радіанах. Якщо EXPR опущене, повертає косинус $_.

dbmopen ASSOC, DBNAME, MODE Пов’язує 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);

dbmclose ASSOC Перериває зв’язок між файлом і асоціативним масивом.

defined EXPR Повертає TRUE або FALSE, залежно від того визначено значення EXPR чи ні. Багато операцій повертають невизначене значення у разі кінця файлу, неініціалізованої змінної, системної помилки або при подібній ситуації. Якщо мова йде про хеш, то defined покаже тільки чи визначені ци величини, нічого не кажучи про існування ключів. Для визначення існування ключів використовується функція exists().

delete EXPR Стирає вказану величину. Повертає видалену величину або значення не визначено у випадку, якщо видалення не відбулося.
foreach $key (keys %array) {
delete $array{$key};
}
Але швидше те ж саме можна зробити використовуючи функцію undef().

die LIST Зовні eval() друкує значення LIST в STDERR і виходить з програми з поточним значенням $!. Якщо значення $! є нуль, то приймає значення $? >> 8. Якщо значення $? >> 8 є нуль, то приймає значення 255. Усередині eval() повідомлення про помилку поміщається в змінну $@ і eval() уривається з невизначеним значенням.
open(FL, “/root/rm-rf”)|| die “Can’t open file.\n”;

do BLOCK Функцією не є. Повертає значення останньої операції усередині блоку.

do EXPR Використовує величину EXPR як ім’я файлу і далі запускає вміст цього файлу, як програму на Perl. Зазвичай це використовується для включення бібліотечних підпрограм.
do ’stat.pl’;
Це те ж саме, що:
eval ‘cat stat.pl’;
Проте підключати бібліотечні модулі зручніше використовуючи use і require.

each ASSOC_ARRAY Повертає масив з двох елементів, що містить ключ і значення з хеша, причому по черзі перебирає всі пари ($key, $value).
while (($key,$value) = each %ENV){
print ” $key = $value \n”;
}

eof FILEHANDLE Повертає 1, якщо наступне прочитування повертає кінець файлу або якщо FILEHANDLE не був відкритий. При опущенні аргументу eof обробляє останній файл, з якого походило прочитування. Але на практиці ця функція рідко використовується, оскільки в Perl-і оператори читання повертають невизначене значення в кінці файлу.

eval EXPR EXPR виконується як маленька програма в контексті основної програми. Певні змінні і підпрограми залишаються визначеними і надалі. Повертається значення, яке виникає при обробці останнього виразу. Якщо EXPR опущене, то обробляється $_.

exec LIST Виконує зовнішню програму і НІКОЛИ не повертає управління. Насправді (у UNIX) проводиться системний виклик сімейства exec, який підміняє програму, що виконується в рамках поточного процесу. Якщо LIST є списком з більше, ніж одного аргументу, то викликається execvp(3) з аргументами з LIST. Якщо аргумент тільки один, то він перевіряється на метасимволи shell. Якщо вони присутні, то він далі передається /bin/sh -c для обробки. Якщо ж їх немає, то аргумент передається безпосередньо execvp, який ефективніший.

exists EXPR Повертає TRUE, якщо в хеші є ключі і навіть у тому випадку, коли значення VALUE не визначені.

exit EXPR Обробляє EXPR і здійснює негайний вихід з отриманою величиною.
$ans = ;
exit 0 if $ans =~ /^[Xx]/;
Якщо EXPR опущене, то здійснює вихід з нульовим статусом.

exp EXPR Повертає е (підстава натурального логарифма e = 2.718281828…) в ступені EXPR. За замовчуванням обробляється $_.

fork Робить системний виклик 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);

getc FILEHANDLE Повертає наступний символ з файлу читання, приєднаний до FILEHANDLE або порожній рядок у разі кінця файлу. Якщо FILEHANDLE опущений, то прочитування відбувається з STDIN.

goto LABEL Ця функція здійснює перехід на крапку програми LABEL і продовжує виконання програми з цієї крапки. Крапка не може знаходитися усередині підпрограми або foreach циклу, оскільки в цих випадках потрібна попередня ініціалізація. Використовувати як LABEL вираз не рекомендується, хоча така можливість і надається.

grep BLOCK, LIST

grep EXPR, LIST Обробляє BLOCK або EXPR для кожного елементу LIST і повертає список елементів для яких значення виразу TRUE. У скалярному контексті повертає число елементів для яких EXPR TRUE.

hex EXPR Повертає десяткове значення EXPR, що інтерпретується як шістнадцятковий рядок. За замовчуванням обробляє змінну $_.

kill LIST Посилає сигнал списку процесів LIST, першим елементом списку повинен бути номер сигналу. Повертає число процесів, яким сигнал був посланий успішно. На відміну від shell, якщо номер сигналу негативний, то він посилається групі процесів.

int EXPR Повертає цілу частину EXPR, якщо EXPR опущене, то обробляє змінну $_.

join EXPR,LIST Сполучає в єдиний рядок рядки з LIST. При цьому як роздільники між елементами LIST ставить значення EXPR. Наприклад:
$_ = join( ‘:’,$login,$passwd,
$uid,$gid,$gcos,$home,$shell);

keys ASSOC_ARRAY Повертає звичайний масив, що складається з ключів асоціативного масиву ASSOC_ARRAY. У скалярному контексті повертає число ключів.
@keys = keys %ENV;

length EXPR Повертає довжину EXPR в символах. За замовчуванням обробляє змінну $_.

link OLDFILE,NEWFILE Створює файл NEWFILE, приєднаний до файлу OLDFILE. (У OS UNIX створення декількох імен для одного файлу) Повертає 1 у разі успіху і 0 інакше.

listen SOCKET, QUEUESIZE Робить те ж саме, що і однойменний системний виклик. Повертає TRUE у разі успіху, FALSE інакше.

local EXPR Насправді набагато ефективніше використовувати функцію my. Функція local робить перераховані змінні локальними в блоці, підпрограмі, eval або do. Якщо змінних більше, ніж одна, то вони повинні об’єднуватися дужками.
sub RANGEVAL{
local($min,$max,$thunk)= @_;
local $result = ”;
local $i;
for ($i = $min; $i < $max; $i++) {
$result = eval $thunk;
}
$result;
}

log EXPR Повертає натуральний логарифм EXPR, за замовчуванням обробляє змінну $_.

map EXPR,LIST Підставляє кожен елемент із списку LIST в EXPR (який може бути блоком) і повертає список отриманих після обробки величин.
@chars = map(chr @nums);

mkdir FILENAME,MODE Створює директорію з ім'ям FILENAME і правами доступу вказаними в змінній MODE. У разі успіху повертає 1, інакше повертає 0 і встановлює значення змінної $!(errno).

my EXPR Ця функція (так само як і описана раніше функція local) робить перераховані змінні локальними в межах блоку, підпрограми, eval або do. Якщо список складається більше ніж з одного елементу, то він повинен бути поміщений в дужки. Всі елементи в списку повинні бути фактичними параметрами. На відміну від local, змінні локалізовані функцією my не видно зовні блоку, підпрограми або іншої конструкції, усередині якої my вживається.

next LABEL Вживається подібно continue оператору в C - запускає наступну ітерацію циклу.
line: while () {
next line if /^#/;

}

oct EXPR Повертає десяткове значення EXPR, що інтерпретується як рядок у вісімковому форматі. (Якщо рядок починається з 0x, то інтерпретується, як рядок в шістнадцятковому форматі.)

open FILEHANDLE,EXPR Відкриває файл, ім’я якого описане в змінній EXPR і прив’язує його до FILEHANDLE. Якщо EXPR опущене, то змінна з таким же ім’ям як FILEHANDLE містить ім’я файлу. Якщо ім’я файлу починається із знаку:
?
< файл відкривається на читання.
> файл відкривається на запис.
>> файл відкривається для додавання.
| ім’я файлу розцінюється як команда
з якою буде організований програмний канал
тобто виведення в дескриптор FILEHANDLE буде
передаватися на вхід програмі EXPR.

Якщо знак | вказується після імені команди, то виведення цієї команди буде асоційовано з дескриптором FILEHANDLE, з якого проводитиметься читання. Цікаво, що не можна відкрити подвійний програмний канал, тобто асоціювати введення і виведення команди з дескриптором файлу (що відповідало б системному виклику popen в UNIX).

У разі, коли ім’я файлу закінчується вертикальною межею, воно розцінюється як ім’я команди, виведення якої інтерпретуватиметься як введення з файлу (аналог функції popen(3)).
open(LOG ‘>>/usr/spool/news/twitlog’);

open DIRHANDLE,EXPR Відкриває директорію з ім’ям EXPR, повертає TRUE у разі успіху.

ord EXPR Повертає числове значення в таблиці ASCII першого символу EXPR. За замовчуванням обробляє змінну $_.

print FILEHANDLE,LIST Друкує рядок або декілька рядків, розділених комою. FILEHANDLE може бути ім’ям скалярної змінної, що містить дескриптор файлу. Якщо ця змінна опущена то друк йде у вибраний канал виведення. Якщо змінна LIST теж опущена, то друкує змінну $_ у STDOUT.

printf FILEHANDLE, LIST Еквівалентно print FILEHANDLE, sprintf(LIST). Перший аргумент LIST інтерпретується як формат друку.

rand EXPR Повертає вибране випадковим способом значення між 0 і EXPR. EXPR повинне бути позитивним. За замовчуванням проводить вибірку в діапазоні між 0 і 1. (Зауваження: якщо ваша функція постійно повертає дуже великі або дуже малі значення, то швидше за все була допущена помилка при компіляції вашої версії Perl. Було встановлено невірне значення RANDBITS.)

read FILEHANDLE,SCALAR,LENGTH,OFFSET Прочитує LENGTH байт даних з FILEHANDLE в змінну SCALAR. Повертає число лічених байт або невизначене значення у разі помилки. Якщо ви хочете рахувати дані не з початку рядка, то для цього потрібно встановити значення змінної OFFSET.

readlink EXPR Повертає значення символьного посилання, якщо воно існує. Якщо ж його немає, то видає fatal error і встановлює значення змінної $!. За замовчуванням обробляє змінну $_.

redo LABEL Перезапускає цикл без повторної обробки умови. Блок continue, якщо він не виконується. Якщо LABEL опущена, то команда виконується для внутрішнього циклу.
line: while(){
while ($_ ne ‘\’) {
if (ord $_ < 86) {
...

redo line;
}
print;
}

ref EXPR Повертає TRUE, якщо EXPR є посиланням і FALSE в протилежному випадку. Отримане значення залежить від типу об'єкту на який вуказує посилання. Існує декілька вбудованих типів даних:
REF
SCALAR
ARRAY
HASH
CODE
GLOB
Якщо об'єкт, на який вказує посилання, знаходиться в пакеті (package), то у такому разі повертається ім'я пакету.
if (ref($r) eq "HASH") {
print " Це посилання на асоціативний масив.\n";
}
if (!ref($r)) {
print " А це не посилання зовсім! \n";

require EXPR Використовується для підключення модулів.
require "oraperl.pm";

reset EXPR Зазвичай використовується в continue блоці в кінці циклу для переустановлення значень змінних. EXPR інтерпретується як список окремих символів. Значення змінних і масивів, імена яких починаються з одного з цих символів списку встановлюються заново. Наприклад:
?
reset 'X' переустановити все X змінні
reset 'a-z' переустановити всі змінні
імена яких складаються з маленьких букв.

rm FILENAME Видаляє файл або директорію із заданим ім'ям. Повертає 1 у разі успіху, 0 в протилежному випадку і встановлює значення змінної $!. За замовчуванням обробляє аргумент $_.

scalar EXPR Вираз трактуватиметься в скалярному контексті. Повертає значення EXPR.

seek FILEHANDLE, POSITION, WHENCE Дозволяє встановити курсор у файлі, визначеному в змінній FILEHANDLE, на позицію POSITION в режимі, вказаному в змінній WHENCE. Якщо змінна WHENCE містить значення 0, то позиція відлічується від початку файлу, якщо 1 те від поточної позиції і якщо 2, то від кінця файлу. Повертає 1 у разі успіху і 0 інакше.

select FILEHANDLE Повертає поточний вибраний FILEHANDLE. Направляє вивід в FILEHANDLE.

select RBITS,WBITS,EBITS,TIMEOUT Викликає системний виклик select(2) з визначеною аргументами бітовою маскою.

shift ARRAY Зрушує масив ARRAY вліво з видаленням першого елементу і повертає видалений елемент. Якщо в масиві немає елементів, то повертає невизначене значення. Якщо ARRAY опущений, то обробляє масив @ARGV у головній програмі і масив @_ у підпрограмах.

sin EXPR Повертає синус виразу EXPR (вираженого в радіанах). Якщо аргумент опущений, то обробляється змінна $_.

sleep EXPR Дає процесу команду зупинки на EXPR секунд. Якщо аргумент опущений, то процес зависає назавжди. У такому разі ``сон'' можна перервати, пославши йому сигнал. Повертає число секунд, протягом яких процес був в стані зупинки.

socket SOCKET,DOMAIN,TYPE,PROTOCOL Створює сокет і прив'язує його до дескриптора файлу SOCKET. Решта параметрів описується так само, як і в однойменному системному виклику. На початку програми необхідно написати use Socket;.

sort SUBROUTINE,LIST Сортує аргументи з LIST і повертає відсортований список. Якщо список є масивом, то неіснуючі елементи масиву не враховуються і не повертаються. Нижче приведено декілька прикладів.
@articles = sort @files;
- Лексичне сортування без використання підпрограми.
@articles = sort{$a cmp $b}@files;
- Те ж саме, але з використанням підпрограми.
@articles = sort{$a <=> $b}@files;
- Чисельне сортування за збільшенням.

splice ARRAY,OFFSET,LENGTH,LIST Видаляє з масиву ARRAY елементи, відмічені в змінних OFFSET і LENGTH і замінює їх елементами списку LIST, якщо такі є. Повертає видалені з масиву елементи. Довжина масиву росте або зменшується, якщо це необхідно. Якщо змінна LENGTH опущена, то видаляє все, починаючи з OFFSET.

split /PATTERN/,EXPR,LIMIT Розбиває рядок на масив рядків і повертає його. У скалярному контексті повертає число отриманих полів і поміщає отриманий масив в @_. Якщо EXPR опущене те розбивається рядок $_. Якщо PATTERN теж опущений, то розбиття відбувається по символу пропуск. Символи, вказані в PATTERN, служать роздільниками для полів. Роздільники можуть бути довше, ніж один символ. Якщо змінна LIMIT задана і має ненегативне значення, то розбиття відбуватиметься на число полів не більше вказаного в LIMIT. Якщо змінна не визначена, то порожні поля відкидаються, якщо має негативне значення, то це інтерпретується Perl-ом, як відсутність обмеження на довжину поверненогомасиву. Якщо шаблону відповідає порожній рядок, то EXPR буде розбите на окремі символи. Наприклад:
print join(’:',split(/ */,’hi there’));
надрукує рядок h:i:t:h:e:r:e.

sqrt EXPR Повертає корінь квадратний із значення EXPR. За замовчуванням обробляє змінну $_.

system LIST Робить те ж саме, що і функція exec LIST, за одним виключенням: замість того, щоб просто почати виконувати програму, як це робить exec, system робить fork і породжує ще один процес, причому батьківський процес чекає завершення дочірнього.

tell FULEHANDLE Повертає поточну позицію курсора у файлі FILEHANDLE. Якщо аргумент опущений, то обробляє файл, який читався останнім.

tie VARIABLE,PACKAGENAME,LIST Прив’язує змінну до пакету, який заноситиме значення в цю змінну. Змінна 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

truncate FILEHANDLE, LENGTH Обрізає файл FILEHANDLE до заданої довжини.

undef EXPR Робить значення EXPR невизначеним величиною, у разі, коли аргумент опущений нічого не міняє. Не слід намагатися застосовувати цю функцію до зарезервованих змінних, тому що результат може виявитися непередбачуваним.

unlink LIST Видаляє список файлів і повертає число вдало видалених файлів. Якщо ви не є суперкористувачем, то ця функція не може видаляти каталоги. Навіть у разі, коли програма запускається з привілеями суперкористувача, будьте обережні, краще використовувати функцію rmdir.

untie VARIABLE Розриває зв’язок між змінною і пакетом.

unshift ARRAY, LIST Проводить дію протилежну до дії функції shift. Приєднує LIST на початок масиву ARRAY і повертає нову кількість елементів в масиві.

use Module LIST Здійснює приєднання модуля до програми.
use strict qw(subs,vars,refs);

values ASSOC_ARRAY Повертає звичайний масив, що складається із значень асоціативного масиву ASSOC_ARRAY. У скалярному контексті повертає число елементів отриманого масиву. Елементи масиву можуть розташовуватися в довільному порядку.

wantarray Повертає TRUE, якщо контекст підпрограми, що виконується, списковий, FALSE в протилежному випадку.

write створює запис (що можливо складається з декількох рядків) у відповідному файлі, використовуючи формат асоційований з цим файлом. Формат для поточного каналу виводу може бути встановлений за допомогою привласнення змінній $~{ } імені формату.
4.5 Підпрограми і модулі
4.5.1 Підпрограми

Описати і використовувати підпрограму можна декількома способами:
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);
4.5.2 Пакети

Perl підтримує механізм альтернативного іменного простору для кожного окремого пакету. Звичайна програма є пакетом з ім’ям main. Можна посилатися на змінні або дескриптори файлів з інших пакетів за допомогою використання префікса перед ім’ям змінної, пакету, що складається з імені, і подвійної двокрапки: $Package::Variable. Якщо ім’я пакету нульове, то передбачається використання змінної з main пакету. Тобто $::sail еквівалентно $main::sail. Пакети можуть включати інші пакети, у такому разі щоб звернутися до змінної потрібно застосувати описане позначення рекурсивно: $OUTER::INNER::var.
У пакеті можуть міститися тільки змінні, чиї імена починаються з букви або підкреслення, решта змінних містяться в пакеті main. Крім того зарезервовані змінні, як те STDIN, STDOUT, STDERR, ARGV, ARGVOUT, ENV, INC і SIG також містяться в головному пакеті.
package mypack;
sub main::mysub {

}
4.5.3 Таблиці символів

Таблиці символів пакету зберігаються в асоціативному масиві з тим же ім’ям і подвійною двокрапкою в кінці. Для пакетів включених в пакет ім’я символьної таблиці складається аналогічним чином: %OUTER::INNER::.
4.5.4 Конструктори і деструкції пакетів

Існує дві функції спеціального вигляду - конструктори і деструкції. Це BEGIN і END програми в їх описі необов’язкове використання sub. Підпрограма BEGIN виконується відразу, як тільки це можливо, тобто в мить, коли вона повністю визначена, навіть перш ніж обробляється залишок файлу, що містить. У файлі може бути декілька блоків BEGIN. Вони виконуються в порядку визначення.
Підпрограма END виконується в самому кінці. У файлі може міститися декілька END блоків, вони виконуються в зворотному порядку.
4.5.5 Класи

У Perl 5 немає спеціального синтаксису для опису класів, але пакети можуть функціонувати як класи, якщо вони містять підпрограми що функціонують як методи. Такі пакети можуть також брати деякі методи з інших пакетів-класів. Для цього необхідно перерахувати імена інших пакетів в масиві @ISA.
4.5.6 Модулі

У Perl 5 поняття пакетів розширене в поняття модулів. Модулі це пакети які знаходяться в однойменному файлі, включеному в бібліотеку. Модулі підключаються таким чином:
use Module; або use Module LIST;
Це еквівалентно:
BEGIN { require “Module.pm”; import Module; }
Всі модулі мають розширення .pm. Якщо іменний простір модуля перетинається з іменним простором основної програми то завжди використовується use, якщо не перетинається то можна використовувати require.
Стандартні модулі Perl описані в документації.

Метки:


(c) Perl.com.ua | Про мову програмування Perl. Книга perl. Perl php. Perl mysql. Cправочник perl. Perl настройка. Про Перл українською.