Типи даних у perl. Функції push та pop. Використання функції print

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

Найкорисніші тести файлів у Perl

Програмування з Perl є досить простим, яке виконується для літер, які ви використовуєте для перевірки файлів. Наприклад, rперевіряє, чи може файл r ead, а Tшукає файл t ext. Ось найбільш корисні тестифайлів у Perl:

Спеціальні символи у Perl

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

Оператори Perl True-False Comparison

Коли ви програмуєте на Perl або будь-якою іншою мовою, ви постійно використовуєте оператори порівняння. У наступній таблиці показано загальні порівняннядля Perl як у математичній, так і у рядковій формі:

push (@r, @s)

зрощування (@r, $#r + 1, 0, @s)

Будь-яка цифра

Матч 1 або більше разів

*

Збіг 0 чи більше разів >?

Ця стаття написана для людей, яким чинність непереборних обставинзакортіло терміново вивчити Перл. Для мене такою обставиною стало те, що мій комп'ютер став WEB-сервером, а я, відповідно, WEB-майстром. Вчитися прийнято на чужих помилках та досвіді, тому пропоную до Вашої уваги свій досвід вивчення Перла.

Відразу треба пояснити, для кого це все написано. Якщо ваш сервер працює на платформі UNIX, то це я маю читати Вашу статтю. У мене ж встановлений Windows NT workstation 4.0 (RUS) плюс Service Pack 3. Коли настав час зробити з комп'ютера WEB-сервер, я кинувся до вбудованих Служб. вузла WEBале швидко зрозумів, що це мені не подобається (чому?). І тут одна добра людина порадила поставити Xitami WEB Serverвід iMatix Corporation (), який і стоїть досі.

Щодо самого Перла, то тут дещо складніше. Покопавшись по різних Перлових серверах (www.perl.org, www.perl.com) я дізнався, що версій Перла настільки багато, що вибрати щось конкретне досить складно. При цьому якихось зрозумілих рекомендацій щодо вибору тієї чи іншої версії ніде немає. Перепробував майже всі версії для Windows, я зупинив свій вибір на Active Perl ().

Людині, розпещеній всякими Віндовозами і Дельфями, писати програми на Перл досить незвично, тому рекомендую відразу встановити Perl Builder. Взяти його можна на www.solutionsoft.com. Там лежала тридцятиденна версія Демо.

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

  1. отримує дані
  2. обробляє дані
  3. видає результати

Передати дані скрипту можна двома методами – GET та POST. Різниця між ними в тому, що при використання GETдані постійно бовтаються в рядку адреси браузера, наприклад:

http://treagraf.tasur.edu.ru/cgi-bin/price.pl?Category=POWER&Description=varta

У цьому випадку скрипт B_price.pl бере дані в змінної оточення QUERY-STRING.

$data=$ENV("QUERY_STRING");

При використанні методу POST даніпередаються на стандартний вхідскрипт. Довжина блоку даних береться до змінної CONTENT_LENGTH:

Read(STDIN,$data,$ENV("CONTENT_LENGTH"));

Тепер ці дані потрібно перевести у вигляд, оскільки вони закодовані.

Стандартною угодою служить заміна прогалин знаками плюс і потім кодування неприпустимих символів, що залишилися, за допомогою ASCII-кодів у шістнадцятковій формі, перед якими ставиться знак (%). Приклад:

http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl ?Category=%C2%E8%E4%E5%EE&Description=%E0%E1%E2%E3

Це означає:

http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?\ Category=Відео&Description=абвг

Декодувати рядок запитів уперше краще самому. На запитання "а як?" є безліч відповідей, переписувати які немає сенсу. Наведу лише короткий приклад:

Замінюємо знаки (+) на прогалини

$query = ~ s/\+/ /g;

Потім замінюємо всі поєднання знака (%), після якого йдуть шістнадцяткові цифри, на відповідний символ ASCII

$query =~ s/%((2))/pack("C", hex($1))/eg;

Я користуюсь тим, що пропонує Perl Builder:

#! E:\perl5\bin\perl # виклик підпрограми отримання $Category = $field("Category"); # Отримуємо дані з поля Category $Description = $field("Description"); # отримуємо дані з поля Description $Page = $field("Page"); # отримуємо дані з поля Page

Наприкінці скрипта розміщуємо підпрограму "прозорого" читання даних.

Sub GetFormInput ((*fval) = @_ if @_ ; local ($buf); if ($ENV("REQUEST_METHOD") eq "POST") ( read(STDIN,$buf,$ENV("CONTENT_LENGTH"))) ; ) else ( $buf=$ENV("QUERY_STRING"); ) if ($buf eq "") (return 0;) else ( @fval=split(/&/,$buf); foreach $i (0 . $#fval)( ($name,$val)=split (/=/,$fval[$i],2); $val=~tr/+/ /; $val=~ s/%(.. )/pack("c",hex($1))/ge; $name=~tr/+/ /; $name=~ s/%(..)/pack("c",hex($1))/ ge; if (!defined($field($name))) ( $field($name)=$val; ) else ( $field($name) .= ",$val"; #if you want multi-selects goto into array change to: #$field($name) .= "\0$val"; ) ) ) return 1; )

Другий етап роботи скрипту – обробка даних – повністю на Ваш розсуд. Перевіряйте отримані дані на правильність, пишіть їх у файл, робіть, що хочете.

І, нарешті, Вам потрібно видати якісь результати клієнту броузеру, причому так, щоб броузер правильно їх відобразив. Тобто видавати результати потрібно в HTML. Це робиться просто: (теж можна по-різному)

Print "Content-type: text/html", "/n/n"; #обов'язковий рядок print "

У полі Category Ви ввели: ", $Category, "

Все це стосується скриптів, які одержують дані з форми на сторінці HTML. При цьому сторінка з формою – окремо, скрипт – окремо. Можна зробити красивіше та зручніше: об'єднати сторінку та скрипт у єдине ціле. Для цього скрипт пишеться за схемою:

  1. При першому запуску скрипт малює HTML сторінкуз формою та посиланням у тезі ACTION на самого себе. Перший запуск визначається за відсутністю вхідних даних.
  2. Якщо вхідні дані є, то одержуємо їх, обробляємо та видаємо результати.

#! E:\perl5\bin\perl if (($ENV("QUERY_STRING") eq "") or ($ENV(CONTENT_LENGTH)=0)) ( # генеруємо сторінку з формою ) else (# отримуємо дані, обробляємо та видаємо результат )

Гостьова книга

Загальний алгоритм роботи гостьової книги такий:

1. Якщо відвідувач хоче зробити запис до книги, то
1.1 Отримуємо дані
1.2 Записуємо їх у файл або базу даних
1.3 Дякуємо на HTML і пропонуємо почитати інші записи
2. Якщо відвідувач хоче почитати записи у книзі, то
2.1 Читаємо записи з файлу або з бази даних
2.2 Виводимо їх красиво у HTML

Для зручності сприйняття я оформив пункти 1 та 2 окремими скриптами add_guestbook.pl та read_guestbook.pl відповідно. Повідомлення гостьової книги зберігаються в текстовому файлірядково, тобто. на кожний запис – рядок. Так зроблено для зручності читання файлу. Приклад одного запису:

Sat Dec 5 13:31:20 1998&Наташа&студентка&Good&Для початку добре. Успіхів на даному терені Вам, Олександре!&нету@пока&194.226.60.34

Ось опис полів гостьової книги.

  • Name - ім'я, прізвище, по батькові, кличка - на розсуд відвідувача
  • Work - професія, рід занять
  • RadioButton - три кнопки: сподобалося (Good), не сподобалося (Bad), пофігу (Different)
  • Text - text box коментарів та приміток
  • Email - зворотна адреса

Так склалося, що я знаю як мінімум двох людей, які хотіли б вивчити Perl. Спеціально для них я вирішив написати цю посаду.

  • Частина 1: Типи змінних (ви читаєте цю частину)

У ньому ви знайдете приклади простих програміз серії «вивести числа від 1 до 5» тощо. Мені завжди подобалося вчитися на прикладах — це цікавіше та швидше, ніж у книжках чи на семінарах. Також можете подивитися пости цього блогу, - велика ймовірність, що в них ви знайдете приклади.

Я припускаю, що в школі/інституті ви вивчали Pascal/Delphi, C або хоча б Basic, і пояснювати, що така функція та цикли не потрібні. Якщо це не так - нічого страшного, просто для того, щоб у всьому розібратися, вам доведеться витратити зайвий часчитання Вікіпедії. Якщо ви не знаєте, як запустити bash-скрипт, або для чого в першому рядку скрипту писати щось на зразок #!/bin/shдоведеться трохи погуглити, щоб це з'ясувати.

Спеціально для тих, кого цікавлять питання, «а чи правда, що Perl дуже складний», «а які книжки з Perl можете порадити» і навіть «еээ… а що, ньому ще пишуть?», я написав Mini-FAQ по Perl , яку Ви можете прочитати на HabraHabr. А для тих, хто неасиліл багатобуквтут я наведу короткий його зміст:

  • Perl - сучасна мовапрограмування, на якому пишуть і писатимуть ще дуже довго.
  • Perl, як і будь-яка інша мова програмування, має свої переваги, недоліки та сфери застосування. Існує справді великийклас завдань, що Perl вирішує на 5+.
  • Синтаксис Perl не складніший за синтаксис C++ або Java. У цьому ви зможете переконатися, дочитавши цей пост до кінця.
  • Існують хороші і при цьому недорогі підручники з Perl. Також у мережі ви легко знайдете співтовариство perl-програмістів, які розмовляють вашою рідною мовою.
  • Perl добре працює як під операційними системами сімейства UNIX, і під Злом Windows.

Додаток:Також я рекомендую вам ознайомитися зі статтями Perl vs Python vs Ruby vs PHP та Жерці програмування. Перша розповідає про продуктивність різних скриптових мов, друга - про відмінність PHPз інших ЯП. Фанатам Пайтона раджу прочитати нотатку Тест продуктивності скриптів на Python. Сподіваюся, що ці матеріали допоможуть вам знайти відповідь на запитання «чому гарний Perl».

Привіт %username%!

Тож давайте вже напишемо наш перший скрипт на Perl!

#!/usr/bin/perl

$name = shift();
print ("Hello, $name!" \n ") ;

Запускаємо скрипт:

$ chmod u+x 1 .pl
$ ./ 1 .pl afiskon
Hello, afiskon!

Тут все дуже просто:

  • Імена скалярних змінних (тобто не масивів і не хешів, що це таке – див нижче) починаються зі знака долара.
  • Функція Shift повертає черговий аргумент скрипта. Тобто перший виклик shift() повертає перший аргумент, другий виклик - другий аргумент і так далі.
  • Функція print() виводить рядок, переданий як аргумент.
  • У рядок можна підставляти значення змінних (див. рядок 4). Детальніше про рядки - див. далі.

Якщо поки що не дуже зрозуміло — нічого страшного. Можливо, трохи теорії зробить трохи більше ясності.

Типи змінних

У Perl існує три основних типи змінних: скаляри(числа та рядки), масиви— подібно до тих, що використовуються в Pascal або C (іноді масиви ще називають векторами), і хеші (асоціативні масиви).

Скалярими вже використали у попередньому прикладі. Ось ще кілька прикладів завдання скалярів.

#!/usr/bin/perl

$a = 123;
$ b = - 7.496;
$c = 0xABC; # одно 2748, так, це коментар:)
$d = ($a + $b) / $c;
$d *= $a; # Теж саме, що $d = $d * $a;

$str1 = "hello";
$str2 = "$str1, world"; # в $str2 записано "hello, world"
$str3 = $a. " \n ". $str2;
$str4 = "$str1"; # в $str4 записано "$str1", а не "hello"

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

$a = 2 ** 8; # результат: 256

З рядками все приблизно так само, як у якомусь PHP. Крапка означає операцію конкатенації (тобто «склеювання» рядків), якщо у рядку містяться імена змінних, на їхнє місце підставляються значення, за допомогою зворотного слеша можна вставляти символи нового рядка(\n), табуляції (\t), лапки (\"), сам зворотний слеш (\\) знак долара без будь-якої підстановки змінних (\$) і багато іншого. одинарних лапках, символи у ній трактуються «як є», без підстановки змінних тощо.

Як і PHP, Perl інтерпретує скаляри, як числа чи рядки залежно від операції. Все просто:

$ int1 = "11" + 22;
# ^ рядок "11" перетворюється на число,
# після чого виконується додавання, результат: 33.
$str1 = "11" . 22;
# ^ число 22 перетворюється на рядок,
після чого виконується конкатенація, результат: "1122".

Правила перетворення з рядка в число і навпаки тут самі, що і в PHP:

$str1 = 0. "abc";
# ^ результат - "abc", число нуль перетворюється на порожній рядок
$ int1 = "aaa" + 1;
# ^ результат - 1, у рядку "aaa" немає цифр
$ int2 = "12aaa" + 1;
# ^ результат - 13, враховуються лише перші цифри рядка

До речі, для оголошення довгих рядківіснують спеціальні оператори - q і qq:

# аналогічно одинарним лапкам
$text = q (
Do you have $15?
} ;
# аналогічно подвійним лапкам
$message = qq (
Hello, $username!
How are you?
} ;

Робота з масивамивідбувається так:

#!/usr/bin/perl

$scalar = "bebebebe" ;
($a, $b) = (1, 2); # Теж саме, що $a = 1; $ b = 2;
@arr = ("aaa", 123, $ scalar, $ a + $ b);
print $arr [1]. " \n ";
push @arr, $a;
print pop (@arr). " \n ";

Тут ми створюємо масив @arr, що складається з 4-х елементів (рядок 5). Потім виводимо другий елемент (рядок 6). Нумерація елементів починається з нуля, тому для виведення другого за рахунком елемента використовується індекс 1. Потім кладемо в кінець масиву значення змінної $a (функція push, рядок 7), і виймаємо і виводимо його ( функція pop, Рядок 8).

Зверніть увагу, імена масивів починаються з «собаки», а не долара (запам'ятати не складно – відповідні символи схожі на перші літери англійських назв типів: $ – scalar, @ – array). При зверненні до другого елементу масиву (рядок 6) використовувався знак долара, оскільки елемент масиву є скаляром. Спочатку це викликає багато плутанини, але взагалі все логічно.

Ще в цьому скрипті ми викликаємо функції printта push без дужок. У Perl при виклику функції, скрізь, де не викликає невизначеності, дужки можна опустити.

Для оголошення масиву, елементами якого є рядки без пробілів, існує спеціальний оператор qw:

@arr = qw/aaa bbb ccc/;
# аналогічно ("aaa", "bbb", "ccc"), тільки коротше

Хешісхожі на масиви, але елементи в хеш не впорядковані. При цьому як ключ, яким здійснюється доступ до елемента, можуть використовуватися рядки.

#!/usr/bin/perl

%hash = ( # при оголошенні хешів та масивів можна
"x" => 12 , # використовувати перенесення рядків
y => 53 , # якщо у ключі немає спец-символів, лапки не потрібні
"z" => - 10.5, # кому на кінці можна залишати
) ;

$hash ("x")++; координата по x тепер дорівнює 13
$ hash (y) -; координата по y тепер дорівнює 52

# виводимо координати
print "x = $ hash (x), y = $ hash (y), z = $ hash (z) \ n";

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

До речі, змінні $test, @test і %test це абсолютно незалежні один від одного змінні різного типу.

У цьому місці я хотів перейти до умовним операторамі циклам for/while, але зрозумів, що для одного посту тексту і так уже забагато. Тим часом за кадром залишилося багато питань:

  • Умовні оператори;
  • Цикли for та while;
  • Оголошення функцій;
  • Робота з потоками та файлами;
  • Суворий синтаксис;
  • Використання готових модулів та класів.

Про це я напишу в одній із наступних нотаток. Хотілося б отримати хоча б кілька коментарів на цю посаду — цікаво/нецікаво, зрозуміло/незрозуміло і так далі. До речі, якщо у вас є питання, пов'язані з Perl (не обов'язково з цією посадою) — сміливо ставте їх у коментарях!

Сподіваюся, серія постів про програмування Perl допоможе вам написати ваші перші простенькі скрипти. З часом скрипти будуть складнішими, в них будуть використовуватися нові технології (ООП, Регулярні вирази) і через деякий час ви знайдете, що знаєте про Perl достатньо, щоб ділитися досвідом з іншими.

Передмова, на наш погляд, має дати читачеві інформацію, на підставі якої він вирішує, чи потрібна йому ця книга.

Про що наша книжка. Вона, звісно, ​​про мову Perl, тому що так заявлено у назві. Кому він потрібний, цей Perl? Тим, хто створює CGI-сценарії, займається адмініструванням системи за допомогою написання скриптів, а не клацаючи лівою кнопкою миші, обробляє тексти, вирішує багато інших завдань суміжних областейі при цьому потребує потужного, але простого застосування засобів, що дозволяє створювати великі програмиі дрібні програми і швидко їх випробувати. Тим, хто викладає програмування, теж корисно мати уявлення про цю мову, оскільки вона має цікаві властивості, відсутні в традиційних мовах програмування, що використовуються в процесі навчання.

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

Мова Perl створена системним програмістомЛаррі Уоллом (Larry Wall) як UNIX, що дозволяє «склеювати» з програмок, виконують окремі функції, великі сценарії на вирішення комплексу завдань, що з адмініструванням, обробкою тексту тощо. буд. мова програмування, в якому знайшли відображення багато тенденцій, що позначилися в технології програмування за останнє десятиліття, і набув широкого поширення у зв'язку з розвитком Inernet. Perl є основним засобом створення програм CGI, зручний для вирішення задач адміністрування Web-серверів, електронної поштита інших систем. Завдяки швидкості та легкості написання сценаріїв цією мовою він поширився і на інші платформи: DOS, Windows, OS/2, Mac, VMS та ін. Одна з основних переваг мови Perl – її відкритість та доступність. У мережі Internetможна отримати абсолютно безкоштовно вихідні текстиінтерпретатора perl (мова Perl - інтерпретована, що в деяких випадках є перевагою) та модулів його розширення.

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