2.5.2. Синтаксис

Perl програма (скрипт) складається з послідовності декларацій і пропозицій. Єдино що повинно бути обов'язково декларовано, це формати зв ітів і п ідпрограми (функції). Усі неоголошен і перемінні, масиви мають значення 0 чи null. Декларації (оголошення).

Perl має в ільний формат. Коментарі починаються із символу '#' і продовжуються до кінця рядка. Декларації можуть використовуватися вбудь-якім місці програми так само як і пропозиції (statements), але діють вони тільки уфаз і комшляції програми. Звичайно їх чи поміщають на початку чи наприк нц програми. Декларац я п дпрограм дозволяє використовувати м'я підпрограми як списковий оператор, починаючи змо менту декларування. Приклад:

sub test; # Декларація підпр ограми test

$varl = test $0; # Використання як оператора списку. Декларації п ідпрограм можуть бути завантажені з окремого файлу пропозицією require чи завантажені й імпортовані впо точну область імен пропозицією use. Докладно див. главу Модулі. Проста пропозиція.

Проста пропозиція обов'язкова закінчується символом ';' якщо тільки ця не остання пропозиція в блоці де ';' можна опустити. Помітьте, що існують оператори такі як eval{} і do{}, що виглядають як складн пропозиц ї, але насправд це терми вимагають обов'язкової вказ вки к нця пропозиц ї. Будь-яка проста пропозиція може містити single модиф ікатор перед    Існують наступні single модиф ікатор и:

if EXPR

unless EXPR

while EXPR

until EXPR

де EXPR - вираження, що повертає логічне значення true чи false. Модиф ікатори while і until

обчислюються на початку пропозиц ї кр м блоку do, що виконується першим.

if EXPR - Модиф ікатор "якщо". Пропозиція виконується, якщо EXPR повертає true.

Приклад:

$var = l;

$var2 = 3 if $var > 0; # Результат: $var2 = З while EXPR - Модифікатор "поки". Пропозиція виконується поки EXPR = true Приклад:

$var = l;

print $var++ while $var < 5; # Печатка $var з інкрементом Результат: 1234

until EXPR - Модифікатор "до ". Пропозиція виконується доти поки EXPR = false Приклад:

$var = l;

print $var++ until $var > 5; # Печатка $var з інкрементом Результат: 12345

unless EXPR - Модиф ікатор "якщо не" . Зворотний до if. Вираження виконується якщо EXPR = false.

Приклад:

$var = 1;

print $var++ unless $var > 5; # Печатка $var з інкрементом Результат: 1 Складні пропозиції.

Посл довн сть простих пропозиц й, обмежена функц ональними обмежниками, називається блоком. У Perl це може бути цілий файл, послідовність пропозицій в операторі eval{} чи найчастіше ця безліч простих пропозиц ій, обмежених круглими дужками '{}'. Існують наступні види складних пропозиц ій:

if (EXPR) BLOCK

if (EXPR) BLOCK else BLOCK

if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK

LABEL while (EXPR) BLOCK

LABEL while (EXPR) BLOCK continue BLOCK

LABEL for (EXPR; EXPR; EXPR) BLOCK

LABEL foreach VAR (LIST) BLOCK

LABEL BLOCK continue BLOCK

Зверніть увагу, що складні пропозиц ії описані втермах блоків, ане пропозицій, як умовах C чи

Pascal. Тому необхідно завжди використовувати круглі дужки для позначення блоку.

if (EXPR) BLOCK - Обчислюється логічне вираження EXPR і якщо true блок виконується.

Приклад:

$var =1; if ($var == 1) { print $var,"\n";

Результат: 1

if (EXPR) BLOCK else BLOCK! - Якщо EXPR=true виконується BLOCK інакше BLOCK2. Приклад:

$var =2; if ($var == 1) і print ' '\$var = 1\n";

І

else

і print "\$var не дор внює 1\n";

І

Результат: $var не дор внює 1

if (EXPRl) BLOCKl elsif (EXPR!) BLOCK! ... else BLOCK - Якщо EXPR1=true виконується BLOCK1 накше якщо EXPR2=true виконується BLOCK2 накше ... накше BLOCK. Приклад:

$var = 1; if ($var == О) і print ' '\$var = О\п";

І

elsif ($var == 1) і print ' '\$var = 1\n";

І

else

і print "Не в доме \$var\n";

І

Результат: $var = 1 Цикл While

Цикл while виконує BLOCK доти поки EXPR = true. М тка LABEL не обов'язкова складається з ідентиф ікатора, що завершується символом    Мітка необхідна при використанні усередині блоку циклу керуючих операторів next, last і redo. Якщо м ітка все-таки в ідсутнє, то ці оператори посилаються до початку найближчого циклу. Блок після continue виконується завжди перед тим як обчислюється логічне вираження EXPR. Це подібно EXPR3 у пропозиції for, тому вцьому блоці зручно змінювати лічильники і прапори циклу нав іть якщо застосовується оператор next. Оператори керування циклом.

next - под бний continue уС. Переходить до початку поточного циклу тобто повторює терац ю. Приклад:

M1:

while ($i < 6)

і

++$i;  # Зб льшуємо л чильник на 1

next M1 if $i < 3; # Переходимо в початок якщо $i < З

++$i;  # накше зб льшуємо л чильник ще раз на 1

І

continue

і

print "$i "; # Друкуємо $i

І

Результат: 1 2 4 6

last - подібний оператору break умов і С. Негайно перериває цикл. Блок continue пропускається. Приклад:

M1:

while ($i < 6)

і

++$i;     # Зб льшуємо л чильник на 1

last M1 if $i > 3; # Виид зциклу якщо $i > З

++$i;     # накше зб льшуємо л чильник ще раз на 1

І

continue і

print "$i "; # Друкуємо $i

Результат: 2 4

re do - почати новий цикл не обчислюючи EXPR  невиконуючи continue блок. Приклад:

M1:

while ($i < 6)

і

++$i;     # Зб льшуємо л чильник на 1

redo M1 if $i == 3; # Далі пропустити для $i = З

++$i;     # накше зб льшуємо л чильник ще раз на 1

І

continue і

print "$i "; # Друкуємо $i

І

Результат: 2 З 7 Цикл for.

LABEL for (EXPR1; EXPR2; EXPR3) BLOCK

Оператор for цілком аналогічний оператору for уС. Уперед початком циклу виконується EXPR1, якщо EXPR2 = true виконується блок, потім виконується EXPR3. Приклад:

for ($i = 2; $i < З; ++$i)

і

print $i, " ";

І

print "\ттосле циклу i = $i\n"; Результат:

2 З 4

П сля циклу i = З Цикл foreach.

LABEL foreach VAR (LIST) BLOCK

Перемінної VAR привласнюється по черз і кожен елемент списку LIST і виконується блок. Якщо VAR опущено, то елементи привласнюються убудованої перемінний $_. Якщо втілі блоку зм нювати значення VAR то це викликає зм ну й елемент в списку тому що VAR фактично вказує на поточний елемент списку. Зам сть слова foreach можна писати просто for - це слова синон ми. Приклад:

@місяць = ("січень","лютий","березень"); # Створили масив foreach $i (@ місяць)

і

print     ";     # Печатка $i

І

Результат: с чень лютий березень Приклад:

@місяць = ("січень","лютий","березень"); # Створили масив foreach $i (@ місяць)

і

$i = uc($i); # Перевели уверхній регістр

І

print @місяць; Результат: ЯНВАРЬФЕВРАЛЬМАРТ

Приклад:

for $i (З,З,7)

і

print "$i ";

І

Результат: З З 7

Блоки й оператор switch.

Блок не залежно в д того має в н чи м тку н семантично являє собою цикл який виконується один раз. Тому дія операторів циклу next, last, redo - аналогічно описаному вище. Блоки зручні для побудови switch (перемикач) структур. У Perl немає спеціального оператора switch, хоча можна скласти щось под бне:

SWITCH:

і

if ($i ==1 ) і.....; last SWITCH; }

if ($i ==2 ) і.....; last SWITCH; }

if ($i ==3 ) і.....; last SWITCH; }

$default = 1З;

І

Оператор goto.

У Perl реалізовано три форми goto. goto - мітка, goto - вираження і goto - п ідпрограма. goto       мітка виконує безпосередній перехд на зазначену мітку.

Обчислює і м'ямітки і робить в ідпов ідний перехід. Наприклад якщо ми хочемо _    зробити перехд на одну з трьох міток "M1:", "M2:" чи 'M3:" у залежності в ід go o       значень перем іншої $i рівної О, 1 чи 2 те це краще зробити втакий спосіб: няражен goto ("M1", "M2", 'M3")[$i];

ня тут $i використовується як ндекс масиву зазначеного безпосередньо у

вираженн .

goto

п. досить рідкий випадок тому що завжди простіше викликати підпрограму

рпаідмпаро   "природним" образом.

Перемінні.

У Perl існує три типи структур даних: скаляри, масиви скалярів і хеши (hashes) - асоціативн і масиви скаляр в. Звичайно елементи масив в ндексуються ц лими числами, перший елемент - нульової. Негативне значення ндексу позначає номер позиц ї елемента зк нця. Хеши ндексуються рядками символ в.

Імена скалярних перемінних завжди починаються із символу '$' нав іть коли позначають елемент

масиву.

Приклад:

$var 1 # Пр остий скаляр 'var1'

$var1[О] # Перший елемент масиву 'var1' $var1 і'йгеҐ} # Елемент з і ндексом 'first'

У випадку використання і мені масиву "цілком" чи його "зрізу" перед ім'ям масиву ставиться символ

Приклад:

@var1 # Всі елементи масиву var1 ( $var1[О], $var1[1], ... $var1[n])

(#гсг1[1,ЗДО]       # Елементи $var1[1], $var1[3], $var1[1О]

@var1 і'йгсҐ,'квҐ} # те жщо і ( $var1 і'first'}, $var1 і'last'} ) Хеш "ц лком" починається з символу '%'. Приклад:

%var, %key, %years

Імена підпрограм починаються символом '&', якщо з контексту не видно, що це підпрограма. Приклад:

&sub1, &test_prog test(12) Імена таблиць символів завжди починаються символом '*'.

Кожен тип перемінних має свою область пам'яті тому $var1 і $var1[О] зовсім різні перемінні, хоча

$var1[О] частина масиву @var1. Так само @var1 і %var1 - різні масиви перемінних.

Імена перем інних можуть містити будь-як буквено-цифров і символи за винятком пробілу і

табуляції. Ц і символи використовуються як розд ільники. Великі і малі букви розрізняються тому

$var1  $Var1 - р зн перем нн . У Perl за замовчуванням мена м ток  покажчик в файл в пишуть

великими буквами.

Контекст .

Велике значення для правильного вживання убудованих функцій має контекст використання результату цих функцій, тому що в противному випадку вони повертають зовсім "незрозумілий" результат. У Perl мається два головних контексти: скалярний і список (list). Простіше говорячи, якщо вл в йчастин вираження мається через одне єдине значення, те це скалярний контекст. Якщо безл ч значень - список. Приклад:

$var1 = <>; # Прочитати один рядок файлу

@var1 = <>; # Прочитати всі рядки файлу вмасив @var1

 $var1 = (1,2,3); # $var = 3 - кількість елементів @var1 = (1,2,3); # Створення масиву @var1 з елементами 1,2,3 Скалярні значення .

Усі дані в Perl це скаляри, масиви скалярів і хеши скалярів. Скалярні перемінні можуть містити числа, рядки і посилання. Перетворення числа - рядка в ідбувається автоматично за замовчуванням. Скаляр може мати т льки одне єдине значення, хоча це може бути посилання на масив скаляр в. Тому що Perl сам перетворює числа врядки і навпаки, те програмісту немає необхідності думати про те, що повертає функц я.

У Perl не існує типів "рядок" чи "число" чи "файл" чи щось ще. Це контекстно залежна поліморфна мова для роботи з текстами.

Скаляр має лог чне значення "TRUE" ( стина), якщо це не нульовий чи рядок число не р вне О. У Perl існує два типи нульових (null) скалярів - визначені (defined) і невизначен і (undefined). Невизначене значення повертається, коли щось не снує. Наприклад, нев домий перем нна, к нець чи файлу помилка. За допомогою функції defined() можна заздалегідь знайти подібний стан. Кількість елементів масиву так само є скаляром і починається символами $# подібно інтерпретатору csh. Фактично $#var1 - це ндекс останнього елемента масиву. Потр бно пам'ятати, що перший елемент має індекс О, тому кількість елементів визначається як $#var1+1 . Присвоєння значення $#var1 зм нить довжину масиву зруйнує "залишен " значення. Присвоєння значення елементу масиву з індексомбільше чим $#var1 збільшить розмір масиву, а присвоєння йому нульового списку -обнулить.

Ускалярному контекст  м'ямасиву повертає його довжину (для списку повертається останн й

елемент).

Приклад:

@var1 = (4, 3, 2, 1); # Присвоєння значення елементам масиву

$i = @var1; # Використання скалярного контексту

print $i; # Печатка результату 4 - в елементів

print (var1; # Списк в контекст, печатка вс х елемент в.

Для примусового одержання скалярного значення зручно застосовувати функцію scalar(). Приклад:

print scalar((var1); # Висновок довжини масиву ане його значень

Хеш у скалярному контексті повертає "true", якщо існує хоча боднапара "ключ-значення". Фактично повертається рядок типу 2/8 де 8 - кількість вид ілених "осередків" пам'яті , а 2 - кількість викор истаних. Конструктори скалярів. Числа пишуться стандартно:

123

123.123

О.12

.12E-m

ОxABCD # Шістнадцятир ічна запис

ОЗ77 # Якщо О на початку - восьмерична

12З_4З6_12З        # Так теж можна для зручності читання. Рядки обмежуються одинарними (') чи подв ійними (") лапками: рівняйсь, сумирно І'

"Побудуємося врятуємося." Способ в позначення рядк в дуже багато. Дивитеся опис оператора qq. Ухеші можна опускати лапки, якщо індекс не містить пробілів. Приклад:

$var1іfїrst} те жщо і $var1 і'йгеҐ} Зверніть увагу на те, що перед першими одинарними лапками повинні стояти пробіл, і накше рядок сприйметься як ім'я перемінної, тому що в іменах дозволене використання одинарних лапках.

Забороняється влапкахзастосовувати зарезервовані літерали_LINE_(номер поточної рядка програми),_FILE_(поточний файл). Для позначення кінця програми можна застосовувати літерал

_END_Весь наступний текст ігнорується, але його можна прочитати використовуючи покажчик

файлу DATA.

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

У Perl їсти можлив сть уставляти текст документа прямо впрограму. Так називаний "here-doc" (тут

текст) метод. Позначається символами << за який йде слово-обмежник.

Приклад:

print <<EOF;        # Усі рядки до EOF - текст для печатки. Гей ви троє, йд ть двох сюди!

Що коштуєш! Ятоб говорю!! Полковник Савоньк .

EOF

Конструктори списків.

Список - безліч значень, перерахованих через кому йув'язнених у круглі дужки. У списковому

контексті список повертає останній елемент списку.

Приклад:

@var1 = (1, 2, 'прив іт', 1.2); # Привласнити значення елементам.

де

$var1[О] = 1, $var1[1] = 2, $var1[2] = 'прив т' $var1[3] = 1.2

$var1 = (1, 2, 'прив т', 1.2); атут $var1 = 1.2 тобто останнє значення списку.

Допускається застосовувати в списку нш списки, але в отриманому списку вже неможливо

розр знити початок  к нець включених списк в.

Приклад:

@s1 = (1, 2, 3); #  Перший список

(s2 = (6, 7, 8);   # Другий

@s = (О, @s1, 4, З, @s2, 9, 1О); # Включаємо списки @s1 і @s2

print @s; # Результат: О12З4З67891О - значення без пробілів. Список без елемент в позначається як () називається нуль-списком. Спискове вираження можна вживати як імтямасиву, але при цьому його потрібно брати вкруглі дужки. Приклад:

print ('січень '/лютий',' бер езень ]; Результат: лютий

Список може бути привласнений списку тільки якщо кожен елемент усписку влів ій частині

вираження допустимо по типі списку вправ ій частин і.

Приклад:

($a, $b, $c) = (1, 2, 3); # $a = 1, $b = 2, $c = 3 Присвоювання списків у скалярному контексті повертає кількість привласнених елементів. Приклад:

$x= (($a, $b, $c) = (1,2)); # Результат $x=2 У випадку присвоювання списку хешу, список розглядаються як пари: ключ-значення. Приклад:

%дні_м ісяця = ('січень', 31, 'лютий', ЗО); Результат: $дні_місяця ісічень} = 31, $дні_місяця ілютий} = ЗО Для зручності запису можна використовувати вираження з => . Приклад:

%дн _м сяця = (

січень => 31, лютий => ЗО,

);

Оператори і пріоритети.

У Perl асоциат вн сть  пр оритетн сть оператор в аналог чна мов С. Нижче перерахован вс оператори впорядку зменшення пріоритету, на початку рядка зазначена асоциатівність.

ассоц.

оператори

 

ліва

терми і лівосторонн і списков і оператори

 

ліва

І->

 

-

 

 

 

 

 

ОНПУ Кафедра "Комп'ютерні системи"

Іправа

**

 

права

! a ? vнapнi + і -

 

ліва

 

 

Іліва

* / % x

 

ліва

+ - .

 

ліва

 

 

-

|iмeнoвaнi v^pm oпepaтopи

 

1-                    < > <= >= lt gt le ge

-

== != <=> eq ne cmp

 

ліва

l&

 

ліва

І Л

 

ліва

&&

 

ліва

Ill

 

1- L

Іправа

1?:

 

права

= += -= *= іт.д.

 

ліва

, =>

 

-

пpaвoбiчнi спискові oпepaтopи

 

ліва

not

 

ліва

and

 

Іліва

or xor

 

Оператори введення -висновку.

У Perl існує кілька операторів уведення-висновку. Перший це дужки із символу "' - акценту. Рядок у цих дужках сприймається як системна команда ірезультат її дії повертається як "псевдо" літерал. У скалярному контексті це рядок утримуюча весь результат, ав списковому - список, елементи якого -рядка результату. Статус виконаної команди зберігається в перемінної $? . Наступна команда уведення висновку виглядає як '<файл>'. Обчислення <файл> приводить до читання рядка зфайлу. 'Файл' тут не ім'яфайлу, а покажчик файлу, що створюється функцією open(). Ускалярному контексті читається один рядок разом із символом 'W - перекладу рядка, ав списковому весь файл читається всписок, елементи якого суть рядка файлу. У випадку виявлення кінця файлу результат оператора не визначений і сприймається як false. Якщо не зазначена перемінна результату, то за замовчуванням це $_. Покажчик файлу за замовчуванням STDIN -стандартне введення. Приклад:

while(<>) { print; }; # Прочитати івивести весь файл STDIN В оператора '<>' єоднавідмінна риса. Якщо в командному рядку немає ніяких аргументів, то читається стандартне введення, якщо є аргументи, то вони вважаються іменами файлів, що послідовно читаються.

Якщо вкутових дужках записана перемінна, то вміст цієї перемінної вважається ім'ям покажчика чи файлу посиланням на покажчик файлу. Якщо такого покажчика не існує, то вміст перемінної сприймається як шаблон імен файлів ірезультат - імена файлів на диску, що підходять по шаблоні. Приклад:

while(<*.pl>) { print;}; # Те жщо і ls *.pl

@files = <*>;    # Масив @files містить імена файлів удиректорії але краще зробити: @files = glob("*"); тому що усередині дужок можна використовувати перемінні.