Оператори управління циклом. next - подібний continue в С. Переходіт на початок поточного циклу, тобто повторює ітерацію.

M1:

while ($i < 6)

{

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

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

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

}

continue

{

print "$i "; # Результат: 1 2 4 6

}

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

M1:

while ($i < 6)

{

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

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

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

}

continue {

print "$i "; # Результат: 2 4

}

redo - почати новий цикл, не обчислюючи EXPR і не виконуючи continue блок.

M1:

while ($i < 6)

{

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

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

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

}

continue {

print "$i "; # Результат: 2 5 7

}

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

for ($i = 2; $i < 5; ++$i){

print $i, " "; # Результат: 2 3 4

}

print "\nПосле циклу i = $i\n"; # Після циклу i = 5

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

@month = ("январь","февраль","март"); # Створили масив

foreach $i (@month)

{ print $i," "; # Результат: січень лютий березень

}

foreach $i (@month)

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

}

print @ month; # Результат: ЯНВАРЬФЕВРАЛЬМАРТ

for $i (3,5,7)

{ print "$i "; # Результат: 3 5 7

}

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

SWITCH:

{

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

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

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

$default = 13;

}

Вибирайте самі за своїм смаком.

Оператор goto.У Perl існує оператор goto. При створенні великих виробничих завдань на останньому етапі, особливо при відробітку помилкових ситуацій звичайно goto потрібний.

У Perl реалізовано три форми goto. goto - мітка, goto - вираз і goto - підпрограма.

goto мітка - виконує безпосередній перехід на вказану мітку.

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

goto ("M1", "M2", "M3")[$i];

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

goto підпрограма - досить окремий випадок оскільки завжди простіше і надійніше викликати підпрограму "природним чином.

POD оператори. Документування програм.У Perl реалізований дуже зручний механізм для написання документації у момент створення програми. Для цього застосовуються спеціальні оператори POD. Якщо в телі програми інтерпретатор зустрічає оператора що починається з символу '=' наприклад:

= head Набор стандартних процедур

то пропускається все до слова '=cut'. Це зручно для включення довгих на декілька рядків або сторінок коментарів. Потім за допомогою спеціальної програми pod можна відокремити текст документації від тексту програми.

Змінні.

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

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

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

$var1[0] # Перший елемент масиву 'var1'

$var1{'first'} # Елемент з індексом 'first'

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

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

@var1[1,3,10] # Елементи $var1[1], $var1[3], $var1[10]

@var1{'first','last'} #то ж що і ($var1{'first'}, $var1{'last'})

Хеш-кодування "цілком" починається з символу '%':

%var %key, %years

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

&sub1 &test_prog, test(12)

Імена таблиць символів завжди починаються символом '*'.

Кожен тип змінних має свою область пам'яті тому $var1 і $var1[0] абсолютно різні змінні, хоча $var1[0] частина масиву @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" (істина), якщо це не нульовий рядок або число не рівне 0.

У Perl існує два типи нульових (null) скалярів - визначені (defined) і невизначені (undefined). Невизначене значення повертається, коли щось не існує. Наприклад, невідома змінна, кінець файлу або помилка. За допомогою функції defined() ви можете заздалегідь виявити подібний стан.

Кількість елементів масиву так само є скаляром і починається символами $#. Фактично $#var1 - це індекс останнього елементу масиву. Потрібно пам'ятати, що перший елемент має індекс 0, тому кількість елементів визначається як $#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

0.12

.12E-10

0xABCD # Шістнадцятковий запис

0377 # Якщо 0 на початку - вісімкова

123_456_123 # Так теж можна для зручності читання.

Рядки обмежуються одинарними (') або подвійними (") лапками:

'Шикуйсь, смирно!' або "Вишикуємося і врятуємося."

У хеш-кодуванні можна опускати лапки, якщо індекс не містить пропусків:

$var1{first} те ж що і $var1{'first'}

Зверніть увагу на те, що перед першою одинарною лапкою повинен стояти пропуск, інакше рядок сприйметься як ім'я змінної, оскільки в іменах дозволено використання одинарних лапок. Забороняється в лапках застосовувати зарезервовані літерали __LINE__ (номер поточного рядка програми), __FILE__ (поточний файл). Для позначення кінця програми можна застосовувати літерал __END__. Весь подальший текст ігнорується, але його можна прочитати, використовуючи покажчик файлу DATA.

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

У Perl є можливість вставляти текст документа прямо в програму, використовуючи "here-doc" (тут текст) метод. Позначається символами <<, за якими йде слово-обмежувач:

print <<EOF; # Всі рядки до EOF - текст для друку.

Ей ви троє, ідиті обоє сюди!

Що коштуєш! Я тобі говорю!!

Полковник Савонькин.

EOF

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

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

$var1[0]= 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 = (0, @s1, 4, 5, @s2, 9, 10); # Включаємо списки @s1 і @s2

print @s; # Результат: 012345678910 - значення без пропусків.

Список без елементів позначається, як (), і називається нуль-списком. Списковий вираз можна вживати як ім'я масиву, але при цьому брати в круглі дужки:

print ('январь','февраль','март')[1];

Результат: лютий

Список може бути привласнений списку, лише якщо кожен елемент в списку в лівій частині вираз допустимий за типом списку в правій частині:

($а, $b, $c) = (1, 2, 3); # $a = 1, $b

Вбудовані змінні Perl.

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

use English;

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

$_ ($ARG) - змінна - за замовчуванням для операторів введення і пошуку. Тобто якщо як аргумент не вказана жодна змінна, то використовується саме ця.

$цифра - містить знайдений в останньому пошуку підрядок, коли шаблон містить метасимволи в круглих дужках. Цифра - це номер дужок. Перший підрядок - номер 1.

$& ($MATCH) - знайдений підрядок в останньому пошуку за шаблоном.

$` - підрядок, передуючий знайденому підрядку.

$' ($POSTMATCH) - підрядок, подальша за знайденим підрядком.

$+ ($LAST_PAREN_MATCH) - підрядок, знайдений в пошуку з вибором по "або".

$* ($MULTILINE_MATCHING) - якщо її значення встановити рівним 1, то змінна, в якій здійснюється пошук, вважатиметься багаторядковою, тобто що містить символи '\n' - переклад рядка. Якщо значення дорівнює 0, то змінна вважається однорядковою.

$. ($INPUT_LINE_NUMBER), ($NR) - номер прочитаного рядка останнього оператора введення. Закриття файлу викликає очищення значення цієї змінної.

$/ ($RS), ($INPUT_RECORD_SEPARATOR) - символ - ознака кінця вхідного рядка. За замовчуванням це '\n'

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

$, ($OFS), ($OUTPUT_FIELD_SEPARATOR) - символ, що додається оператором print після кожного елементу із списку параметрів.

$\ ($ORS), ($OUTPUT_RECORD_SEPARATOR) - символ, print, що додається, після виведення всіх параметрів.

$" ($LIST_SEPARATOR) - аналогічний "$",, але додається після кожного елементу масиву, вказаного в "....".

$# ($OFMT) - формат за замовчуванням для виведення чисел.

$% ($FORMAT_PAGE_NUMBER) - формат за замовчуванням для виведення номерів сторінок.

$= ($FORMAT_LINES_PER_PAGE) - довжина однієї сторінки. За замовчуванням 60 рядків.

$- ($FORMAT_LINES_LEFT) - кількість рядків, що залишилися, на сторінці.

$~ ($FORMAT_NAME) - ім'я формату поточного виводу. За замовчуванням ім'я покажчика.

$^ ($FORMAT_TOP_NAME) - ім'я поточного формату для заголовка сторінки.

$: ($FORMAT_LINE_BREAK_CHARACTERS) - символи перенесення рядка для багаторядкових полів. У рядку формату такі поля починаються з '^'. За замовчуванням '\n-'.

$^L ($FORMAT_FORMFEED) - символ перекладу формату (аркуша). За замовчуванням '\f'.

$^A ($ACCUMULATOR) - поточне значення акумулятора функції write() для format(). Значення цієї змінної можна побачити лише при використанні функції formline(), оскільки write() очищає її після кожного виводу.

$? ($CHILD_ERROR) - дана змінна містить статус завершення таких процесів як: закриття pipe, завершення функцій system(), wait() і `...`.

$! ($ERRNO $OS_ERROR) - в числовому контексті повертає код помилки errno. У строковому - рядок повідомлення про помилку. Можна примусово привласнити цій змінній код помилки, що б отримати системне повідомлення для даної коду або встановити код завершення для функції die().

$@ ($EVAL_ERROR) - повідомлення про помилку останньої команди eval().

$$ ($PID), ($PROCESS_ID) - номер поточного процесу.

$O ($PROGRAM_NAME) - ім'я файлу програми.

$[ - номер першого елементу масиву або символу рядка. Значення за замовчуванням - 0.

$] ($PERL_VERSION) - рядок - повідомлення версії Perl. Друкується по команді perl -v В числовому контексті це номер версії плюс номер модифікації / 1000.

$^T ($BASETIME ) - Час в секундах з початку 1970 року старту поточної програми.

$^X ($EXECUTABLE_NAME) - команда запуску Perl. Аналогічно argv[0] в С.

$ARGV - ім'я поточного файлу, що читається оператором '<>'.

@ARGV - масив параметрів рядка запуску програми. Увага! @#ARGV - менше кількості параметрів на 1, оскільки $ARGV[0] це перший параметр (не ім'я програми).

@INC - список директорій диска, які переглядає Perl для виконання команд do, require або use.

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

$ENV{вираз} - хеш-кодування %ENV містить значення змінних оточення. Зміна цих значень викликає зміну оточення для процесів нащадків.

$SIG{вираз} - хеш-кодування %SIG містить імена підпрограм для таких системних сигналів як INT, QUIT, PIPE ... Значення 'DEFAULT' - для системної обробки. 'IGNORE' - ігнорувати даний сигнал.

Регулярні вирази (шаблони).

Регулярні вирази в Perl найчастіше використовуються в операторах пошуку і заміни таких як s/, m/, операторах в'язки =~ або != і так далі Всі ці оператори мають схожі опції:

i - не розрізняти рядкові і заголовні букви.
m - вважати рядок багаторядковим.
s - однорядковий рядок.
x - розширений синтаксис (використання пропусків і коментарів)

Ці опції, що позначаються як '/x', можна використовувати усередині шаблонів, використовуючи конструкцію (?...). У шаблонах використовуються наступні метасимволи (символи, що позначають групи інших символів):

\ - рахувати наступний метасимвол як звичайний символ.
^ - початок рядка
. - один довільний символ. Окрім '\n' - кінець рядка.
$ - кінець рядка
| - альтернатива (або)
() - угрупування
[] - клас символів

Метасимволи мають модифікатори (пишуться після метасимвола):

* - повторюється 0 або більше число разів
+ - -//- 1 або більше число разів
? - 1 або 0 разів
{n} - точно n разів
{n} - щонайменше раз
{n,m} - не менше n, але і не більше m

У всіх інших випадках фігурні дужки вважаються звичайними (регулярними) символами. Таким чином '*' еквівалентна {0,}, '+' - {1,} і '?' - {0,1}. n і m не можуть бути більше 65536.

За замовчуванням дія метасимволів "жадібна" (greedy). Збіг поширюється стільки раз, скільки можливо, не враховуючи результат дії наступних метасимволів. Якщо ви хочете "зменшити їх апетит", то використовуйте символ '?'. Це не змінює значення метасимволів, просто зменшує поширення. Таким чином:

*? - стане 0 і більш
+? - 1 і більш
?? - 0 або 1 раз
{n}? - точно n разів
{n}? - не менше n разів
{n,m}? - більше або рівне n і менше m разів

Шаблони працюють так само, як і подвійні лапки, тому в них можна використовувати `\` - символи (бэкслэш-символы):

\t - символ табуляції
\n - новий рядок
\r - переведення каретки
- переклад формату
\v - вертикальна табуляція
- дзвінок
\e - escape
\033 - вісімковий запис символу
\x1A - шістнадцятирична
\c[ - control символ
\l - нижній регістр наступного символу
\u - верхній регістр -//-
\L - всі символи в нижньому регістрі до \E
\U - у верхньому -//-
\E - обмежувач зміни регістра
\Q - відміна дії як метасимвола

Додатково в Perl додані наступні метасимволи:

\w - алфавітно-цифровий або '_' символ
\W - не -//-
\s - один пропуск
\S - не один пропуск
\d - одна цифра
\D - не одна цифра

Зверніть увагу, що все це "один" символ. Для позначення послідовності застосовуйте модифікатори. Так:

\w+ - слово
\d+ - ціле число
[+-]?\d+ - ціле із знаком
[+-]?\d+\.?\d* - число з крапкою

Існують уявні метасимволи, що позначають місця зміни значення:

\b - границя слова
\B - не границя слова
\A - початок рядка
\Z - кінець рядка
\G - кінець дії m//g

Границя слова (\b) - це уявна крапка між символами \w і \W. Усередині класу символів '\b' позначає символ backspace (стирання). Метасимволи \A і \Z - аналогічні '^' і '$', але якщо початок рядка '^' і кінець рядка '$' діють для кожного рядка в багаторядковому рядку, то \A і \Z позначають початок і кінець всього багаторядкового рядка.

Якщо усередині шаблону застосовується угрупування (круглі дужки), то номер підрядка групи позначається як '\цифра'. Відмітьте, що за шаблоном в межах вираз або блоку ці групи позначаються як '$цифра'. Існують і додаткові змінні:

$+ - позначає останній збіг
$& - весь збіг
$` - все до збігу
$' - все після збігу







Дата добавления: 2016-04-02; просмотров: 740;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.039 сек.