Лістинг 5.5. Підпрограми.
# Програма обчислення факторіалу.
print fact(3); # обчислити факторіал 3*2*1
sub fact # Визначаємо підпрограму.
{ my $m; # private змінна але не local !
$m = $_[0];
return 1 if $m <= 1;
return($m * fact($m -1));
}
Можна вказувати початкові значення private змінних як:
· my(список)= вираз;
Так для наведеного вище прикладу краще було написати:
· my($m)= $_[0];
Змінні типа local.Загалом краще використовувати private змінні, оскільки це надійніше і швидше. private змінні забезпечують лексичну сферу застосування (видимості), а local - динамічну. Звичайно це змінні форматів, значення яких має бути видиме з підпрограм, що викликаються. Вживання функції local() недоцільно в циклах, оскільки вона викликається кожного разу і таким чином помітно збільшує час виконання циклу.
Прототипи (prototypes).Для короткого опису типа передаваних підпрограмі параметрів можна застосовувати прототипи. У Perl існують наступні прототипи:
Декларація | Приклад виклику |
sub mylink($$) | mylink $old, $new |
sub myvec($$$) | myvec $var, $offset, 1 |
sub myindex($$;$) | myindex &getstring, "substr" |
sub myreverse(@) | myreverse $a, $b, $c |
sub myjoin($@) | myjoin ":",$a,$b,$c |
sub mypop(\@) | mypop @array |
sub mysplice(\@$$@) | mysplice @array, @array, 0, @pushme |
sub mykeys(\%) | mykeys %{$hashref} |
sub myopen(*;$) | myopen HANDLE $name |
sub mypipe(**) | mypipe READHANDLE, WRITEHANDLE |
sub mygrep(&@) | mygrep { /foo/ } $a, $b, $c |
sub myrand($) | myrand 42 |
sub mytime() | mytime |
Тут:
· \'символ' - параметр з типом 'символ'
· '@' або '%' - параметри, що все залишилися, як список
· '$' - скаляр
· '&' - безіменна підпрограма
· '*' - посилання на таблицю імен
· ';' - розмежувач обов'язкових і не обов'язкових параметрів.
Посилання як параметр.Інколи потрібно як параметр передати підпрограмі не значення елементу масиву, а посилання на нього, аби підпрограма могла змінити значення елементу. Для цього в Perl до імені змінної додається символ '*' Подібне вираз називають 'Type glob' так само як в Unix символом '*' позначають "всі можливі значення". Тому '*' для масиву означає "всі елементи масиву". Для скалярів вживати '*' не має сенсу, оскільки вони і так передаються посиланням і ви можете змінювати значення параметра, змінюючи, наприклад, змінну $_[0].
Перевизначення вбудованих функцій.Більшість вбудованих функцій Perl можна перевизначити своїми власними. Звичайно це роблять для зручності сумісності Perl для різних платформ систем. Для цього потрібно перерахувати імена цих функцій у вигляді:
· use subs 'функция1', 'функция2' ....;
і далі в модулі визначити самі функції.
Автозавантаження.Якщо ви спробуєте викликати неіснуючу функцію, то Perl видасть повідомлення про помилку. Але якщо ви визначите підпрограму з ім'ям 'AUTOLOAD', то вона буде викликана з тими ж параметрами, а змінна $AUTOLOAD міститиме ім'я неіснуючої підпрограми. Даний механізм дуже зручний для засобів відладки.
Модулі (packages).
У Perl реалізований механізм модулів. Модуль це група підпрограм і змінних, зазвичай включених в один файл. Усередині одного модуля можна визначити інший модуль. Початок модуля визначається директивою:
· packages ім’я_модуля;
Кінець модуля це кінець блоку або файлу. Головний модуль має за замовчуванням ім'я main. На ім'я усередині модуля можна посилатися, додаючи '::' після імені модуля:
$main::var1 - змінна в головному модулі.
::var1 - те ж саме. Ім'я main можна опускати.
$модуль1::var1 - змінна в модулі 'модуль1'
$модуль1::модуль2::var1 - Модуль2 міститься в модулі 1.
Лише ідентифікатори, що починаються з букви або символу '_', зберігаються в просторі імен поточного модуля. Останні зберігаються в просторі головного модуля main. Окрім цього імена STDIN, STDOUT, STDERR, ARGV, ARGVOUT, ENV, INC і SIG так само зберігаються в головному модулі.
Таблиці імен.Всі імена модуля зберігаються в асоціативному масиві (хеш-кодуванні) з ім'ям модуля, до якого додані символи "::". Таким чином, імена головного модуля зберігаються в %main::, модуля 'mod1' в %mod1:: і так далі Вираз вигляду *имя вказує значення елементу хеш-кодування 'ім'я', це зручно для визначення констант.
*pi = \3.14159;
Тут змінна $pi - це константа пі, яку вже не можна змінити.
Конструктори і деструкції.Конструктор - це підпрограма, яка виконується у момент створення об'єкту, а деструкція - видалення об'єкту. Для модуля це підпрограми з іменами BEGIN і END. При визначенні цих підпрограм слово sub можна опускати.
Конструктор BEGIN виконується відразу, як тільки можливо, тобто як тільки він визначений, навіть не завершуючи подальший розбір програми. Можна вказати декілька блоків BEGIN. Вони виконуватимуться один за іншим в порядку визначення.
Деструкція END виконується останньою як тільки можливо, тобто при завершенні роботи інтерпретатора. Можна вказати декілька блоків END, при цьому вони виконуватимуться в зворотному визначенню порядку.
Класи.У Perl немає спеціального синтаксису для класів. Але функціонально повноцінними класами можуть бути модулі. При цьому підпрограми модуля стають методами, а за допомогою масиву @ISA можна реалізувати механізм спадкоємства в класах. Детальніше класи розглядати не будемо.
Створення бібліотеки.Якщо ви хочете створити модуль окремим файлом і використовувати як бібліотеку підпрограм, при цьому викликати підпрограми бібліотеки, не вказуючи імені модуля, вам необхідно оформити модуль таким чином:
package имя_модуля; #Такое ж, як ім'я файлу без розширення '.pm'
require Exporter; # Обов'язковий рядок для експорту імен
@ISA = qw(Exporter); # -//-
@EXPORT = qw(func1 func2) #Перечисляем імена функцій. Немає коми!
@EXPORT_OK = qw($переменная @массив); #Указать прилюдні #переменные, масиви і так далі якщо необхідно
{ # Початок блоку модуля
.....
sub func1
........
sub func2
........
1;
}
Даний файл з розширенням ".pm" повинен зберігатися в одній з бібліотечних директорій Perl. Вони перераховані в масиві @INC, одна з них зазвичай "/usr/local/lib/perl/".
У головній програмі ви вказуєте:
· use ім’я_модуля;
і вам стають доступні імена підпрограм даного модуля.
Perl бібліотеки.Стандартний набір бібліотек зазвичай поставляється з дистрибутивом Perl, вони розділяються на pragma бібліотеки (працюють як директиви компілятору) і стандартні бібліотеки.
Pragma бібліотеки.Дані бібліотеки використовують як:
· use ім'я;
коли хочуть включити дію і
· no ім'я;
коли хочуть вимкнути.
У стандартний набір входять наступні pragma:
diagnostics- Включити режим розширеної діагностики.
integer- Використовувати цілочисельну арифметику.
less- Режим мінімального завантаження компілятора.
overload- Режим перевизначення операторів.
sigtrap- Режим стеження за перериваннями.
strict- Режим обмеженого використання "небезпечних" операторів.
subs- Режим обов'язкового декларування підпрограм.
Стандартні бібліотеки.З точки зору web-програмування найбільший інтерес представляють бібліотеки для роботи з тегами HTML і для доступу до баз даних. Їх ми розглянемо ледве пізніше і більш детально. Детальний опис кожної бібліотеки записаний в самому файлі.
CPAN.Програмісти всього світу, що працюють з Perl, створили загальнодоступну бібліотеку модулів CPAN . Вона доступна через інтернет і містить величезну кількість різних за призначенням модулів. До них відносяться документатор, системні інтерфейси, інтерфейси роботи з базами даних, робота в мережі, з файлами, интернет-броузеры, системи пошуку, величезна кількість CGI скриптів для Web серверів і багато чого інше.
Формати.У Perl реалізований зручний метод створення форматованих звітів. За допомогою оператора format ви описуєте заголовки, розміри полів, вказуєте положення даних на аркуші в зручній текстовій формі. Потім виконуєте команду write(файл), яка виводить дані, що відформатували, у вказаний файл.
Оператор format має наступний синтаксис:
format ім'я =
FORMLIST
.
Зверніть увагу на те, що опис формату йде після рядка format і закінчується символом '.' на початку рядка. Тут 'ім'я' - це ім'я формату, таке ж як і ім'я покажчика вихідного файлу. Якщо 'ім'я' відсутнє те значення за замовчуванням - STDOUT.
FORMLIST - це рядки формату. Вони бувають трьох типів:
1. Коментар. Рядок починається символом '#'.
2. Описувач полів даних (picture).
3. Рядок аргументів використовуваних описувачем.
Описувач - це рядок, який виводиться у вигляді "як є" за винятком спеціальний позначених форматів полів даних. Кожне поле починається або символом '@', або '^'. У описовому рядку вказується лише положення і вигляд даних, що виводяться, але не імена полів і змінних. Для цього призначений наступний рядок аргументів яка слідує завжди після описувача і містить імена змінних або цілі вирази в порядку вказаному описувачем. Розмір і вигляд поля в описувачі позначається символами:
"<<<<" | - вирівняти значення по правому краю. |
">>>>" | - -//- по лівому. |
"|" | - -//- по центру. |
"####.###" | - формат числа з крапкою. |
"@*" | - багаторядковий рядок. Дані виводяться в колонку. |
Розмір поля дорівнює кількості вказаних символів. Символ '^' на початку поля має спеціальне значення. Так:
· "^####" - порожньо якщо змінна не визначена.
для рядкового скаляра:
· "^<<<<<" - Виводиться скільки можливо символів, а значення змінної міняється на залишок, виведення якого можна продовжити на наступних рядках, які можуть мати свої поля.
Спеціальні змінні:
· $~ - відрядковий формат вмісту.
· $^ - формат заголовка аркуша.
· $% - номер аркуша.
· $= - рядків в аркуші.
Якщо ви хочете використовувати одні формати для різних файлів, то найпростіша шлях:
use FileHandle; # Вказати на початку програми
format_name файл имя_формата; # Формат вмісту аркуша.
format_top_name файл имя_формата; # Формат заголовка аркуша.
write(файл); # виведення даних.
Тут 'файл' мається на увазі покажчик файлу, отриманий командою open();
Якщо вам потрібно в тілі аркуша виводити різного роду формати (наприклад, заголовки груп або відбиття аркуша), то застосовуйте format_name.
CGI-програмування.
Використання CGI.pm.Отже, як створюється CGI сценарій? Теоретично це дуже просто - програма CGI, як і будь-яка інша програма, на Perl виконує звичайні команди Perl, коли вона викликається броузером (тобто коли броузеру як URL задається CGI-сценарий). Все, що ви направляєте в стандартний вивід, передається броузеру. Так, якщо CGI-сценарий виконує команду print "Hello!", цей текст буде повернений броузеру, і на сторінці з'явиться напис "Hello'" Але це рудиментарний спосіб. Чи потрібно прочитати дані, введені користувачем за допомогою елементів управління, розташованих на сторінці? Або ви захочете створити ці елементи управління з сценарію? Аби зробити все це і багато що інше, використовується той, що додається до Perl пакет CGI.pm. (Далі ми розглянемо інший популярний пакет — cgi-lib.pl.) З одного боку, це стандартний спосіб роботи з CGI засобами Perl, з іншої — відмінне введення в CGI.pm.
Отже, інтерпретатор Perl містить, серед інших модулів, стандартний модуль CGI.pm. Поетому якщо у вас встановлений Perl, то, швидше за все, є і CGI.pm. Починаючи з п'ятої версії Perl CGI.pm став об'єктно-орієнтованим, хоча спрощений функционально-ориентированный інтерфейс все ще існує. У наших прикладах ми використовуватимемо об'єктно-орієнтоване програмування. Створюючи за допомогою CGI.pm об'єкти CGI, ми викликатимемо різні методи цього об'єкту. Існують методи, відповідні практически всім основним тегам HTML, і при їх виклику створюється потрібний тег з вказаними атрибутами. Всі вони можуть отримувати іменовані параметри (за винятком методів, требующих один аргумент), іншими словами, потрібно вказати не лише значення атрибуту HTML, але і його ім'я. У наступному прикладі об'єкт CGI створює Web-сторінку за допомогою вбудованих методів. Зверніть увагу на іменовані параметри методу textarea, задающие ім'я області редагування тексту ('textarea'), значення за замовчуванням і розміри:
Дата добавления: 2016-04-02; просмотров: 605;