Рубріки: Теорія

Не Python, але теж непогано: що таке Perl та чому його можна вивчати новачкам

Сергій Бондаренко

Сьогодні ми коротко розглянемо таку мову програмування як Perl. Які у неї є переваги та недоліки, який у неї синтаксис та що вона вміє.

Історія появи та для чого використовується

Ларрі Уолл

Мова програмування Perl — це дуже стара мова програмування, яку ще наприкінці 1980-х років розробив американський програміст Ларрі Уолл

За фахом Ларрі лінгвіст та навіть у якийсь час разом зі своєю дружиною займався перекладом Біблії. Можливо, саме тому під час розробки мови програміст вигадав дві «заповіді», які визначають її філософію:

  • перша звучить як «Є кілька способів зробити це»;
  • а друга — «Легкі речі мають бути легкими, а складні мають бути можливими».

Спочатку Perl позиціонувався як альтернатива для AWK — сценарної мови рядкового аналізу та обробки вхідного потоку (наприклад, текстового файлу) за заданими шаблонами.

Свою назву мова отримала як абревіатура від чотирьох слів: Practical Extraction and Reporting Language. Це відсилання саме до початкового призначення мови, яке полягало в полегшенні процесу вилучення та звітності даних з текстових файлів.

Але з часом Perl стала мовою загального призначення, яка використовується для різних задач програмування, включаючи веброзробку, системне адміністрування, наукові обчислення та багато іншого. На сьогодні на базі мови Perl було реалізовано такі проєкти, як Yahoo, Amazon та мільйони інших продуктів.

Оскільки скорочення англійською мовою звучить схоже на «перлина», логотип спочатку теж хотіли обрати відповідний. Але виявилось, що мова програмування з такою назвою та символікою вже є. Тому замість перлини у якості емблеми зараз використовується верблюд. Він уособлює витривалість та здатність вирішувати складні завдання.

Для програмування на Perl необхідно встановити інтерпретатор Perl. Завантажити його можна з офіційного сайту проєкту.

Perl доступний для скачування та встановлення на багатьох платформах, включаючи Windows, MacOS та Linux. Більшість UNIX-систем, включаючи macOS, постачаються із встановленою версією Perl, і багато системних інструментів та скриптів, написаних для UNIX-систем, використовують Perl.

Синтаксис

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

Крім того, Perl дублює багато можливостей мови AWK для обробки текстових даних, включаючи регулярні вирази та оператори для обробки рядків. Також можна побачити певну схожість з мовою командного рядка Unix Shell, наприклад, можливість запуску зовнішніх команд та використання змінних середовища. 

Щоб переконатися у подібності до мови С, достатньо поглянути на два фрагменти коду. Перший написаний на Perl:

#!/usr/bin/perl

$cars = ["Toyota", "Honda", "Ford", "Chevrolet"];
$car_colors = ["red", "blue", "green", "silver"];

for my $i (0 .. $#{$cars}) {
  print "$cars->[$i] is $car_colors->[$i]\n";
}

Другий код на С:

#include <stdio.h>

int main() {
  char *cars[] = {"Toyota", "Honda", "Ford", "Chevrolet"};
  char *car_colors[] = {"red", "blue", "green", "silver"};
  int i;
  for (i = 0; i < 4; i++) {
    printf("%s is %s\n", cars[i], car_colors[i]);
  }
  return 0;
}

Результат виведення на екран буде однаковим в обох випадках:

Toyota is red
Honda is blue
Ford is green
Chevrolet is silver

Обидва коди створюють масиви cars та car_colors, які містять назви автомобілів та їх кольори. Потім за допомогою циклів кожен елемент масиву виводиться на екран, включаючи відповідний йому колір.

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

Змінні

Perl відноситься до динамічних мов програмування, тобто він не вимагає явної типізації змінних під час оголошення.

У Perl тип змінної визначається автоматично під час виконання програми, залежно від значення, яке їй надається.

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

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

Змінні Perl починаються з символу $. Наприклад, рядок $name = "Highload"; оголошує змінну $name зі значенням Highload.

В Perl змінні можуть містити значення різних типів і тип змінної може змінюватися в процесі виконання програми:

my $x = 10;
$x = "hello";

Використовуючи символи $ або @, змінні можна вставити в рядок:

my $name = "Highload";
print "Hello, $name!\n";

Умовні оператори

Perl підтримує стандартні умовні оператори, такі як if, elsif та else:

if ($age < 18) {
  print "You are underage\n";
} elsif ($age < 21) {
  print "You are not allowed to drink alcohol in the US\n";
} else {
  print "You can drink alcohol in the US\n";
}

Цикли

Perl підтримує цикли for, foreach, while, do-while та until. Приклад використання циклу for:

for (my $i = 0; $i < 10; $i++) {
  print "Count: $i\n";
}

Регулярні вирази

Регулярні вирази — це сильна сторона мови. Завдяки їм Perl відомий своїми можливостями обробки тексту. Наприклад, вираз /hello/ відповідає рядку hello.

Користувачі Perl мають можливість реалізовувати будь-які складні шаблони для пошуку, заміни та маніпуляції рядками. Для цього можна використовувати оператор відповідності =~ та шаблон регулярного виразу, укладений у слеші /

my $str = "The highload today";
if ($str =~ /today/) {
  print "The string contains the word 'today'\n";
}

У цьому коді рядок “The highload today” перевіряється на наявність слова “today” за допомогою регулярного виразу /today/.

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

  • використання квантифікаторів;
  • угруповання;
  • альтернативи.

У прикладі нижче рядокThe quick brown fox jumps over the lazy dog” перевіряється на наявність фрази “quick brown fox”, “quick brown dog”, “slow red fox” або “slow red dog” за допомогою одного регулярного виразу — (quick|slow) (brown|red) (fox|dog):

my $str = "The quick brown fox jumps over the lazy dog";
if ($str =~ /(quick|slow) (brown|red) (fox|dog)/) {
  print "The string matches the pattern\n";
}

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

  • квантифікатор + вказує на одне або більше входжень;
  • пробіл вказує на нуль або більше входжень;
  • а квантифікатор ? вказує на нуль або одне входження.

В Perl також доступні інші операції, такі як перегляд вперед та назад, заперечення, операції з підрядками та багато іншого. Все це робить регулярні вирази у Perl потужним інструментом для роботи з текстом.

Використовуючи оператор заміни =~ s// для заміни тексту, можна, наприклад, обробити фрагмент, замінивши одне слово у рядку іншим.

У коді нижче слово “yesterday” змінюється на слово “today” в рядку “The highload yesterday is the best source of knowledge”:

my $str = "The highload yesterday is the best source of knowledge";
$str =~ s/yesterday/today/;
print "$str\n"; # "The highload today is the best source of knowledge"
}

Структури даних

Perl може працювати з масивами, хешами та списками. Код нижче створює масив @numbers, що містить числа від 1 до 5, та хеш %colors, містить пари ключ-значення, де ключі — це рядки, а значення — шістнадцяткові коди кольорів:

my @numbers = (1, 2, 3, 4, 5);

my %colors = (
  red   => '#ff0000',
  green => '#00ff00',
  blue  => '#0000ff',
);

Змінна @numbers містить список чисел, укладених у круглі дужки та розділених комами. Для доступу до елементів масиву можна використовувати індексацію за допомогою квадратних дужок. Наприклад, $numbers[0] має значення 1, а $numbers[4] — значення 5.

Хеш %colors містить пари ключ-значення, розділені символом =>. Ключі в хеш можуть бути будь-якого типу, але у цьому випадку використовуються рядки. Значення зберігаються у відповідних ключах осередках та можуть бути вилучені за ключом за допомогою оператора фігурних дужок. Наприклад, $colors{red} містить значення #ff0000.

Функції

Мова програмування Perl вміє працювати з функціями.

У прикладі нижче — оголошення користувальницької функції greet, яка приймає один аргумент $name. Усередині функції відбувається виведення вітання на екран, в яке вставляється значення аргументу $name. Далі викликається функція greet з аргументом Visitor, що приведе до виведення на екран “Hello, Visitor!” :

sub greet {
  my ($name) = @_;
  print "Hello, $name!\n";
}
greet("Visitor");

ООП

Perl — це об’єктно-орієнтована мова, тобто вона дає можливість працювати з класами, об’єктами та використовувати успадкування.

Ось приклад роботи з класами в Perl:

package Person;

sub new {
  my $class = shift;
  my $self = {
    name => shift,
    age => shift,
  };
  bless $self, $class;
  return $self;
}

sub get_name {
  my $self = shift;
  return $self->{name};
}

sub get_age {
  my $self = shift;
  return $self->{age};
}


1;  # У Perl модуль повинен повертати справжнє значення.

Цей код описує клас Person, реалізований у Perl. У класу є конструктор new, який створює новий об’єкт класу Person та ініціалізує його властивості name та age значеннями, переданими як аргументи конструктора.

Методи get_name та get_age дозволяють набути значення властивостей об’єкта.

Наприкінці файлу є рядок 1. Він вказує на те, що модуль успішно завантажений та повинен повертати справжнє значення. Цей код може бути використаний в інших частинах програми для створення об’єктів типу Person та отримання їх властивостей:

use Person;

my $person = Person->new("Bondarenko", 44);
print "Name: " . $person->get_name() . "\n";
print "Age: " . $person->get_age() . "\n";

Код створить новий об’єкт Person з ім’ям Bondarenko та віком 44, і виведе його властивості на екран.

Однорядкові програми

Однією з особливостей Perl є можливість створення «програм з одного рядка».

Однорядкові програми (однорядники) – це короткі скрипти мовою Perl, які виконуються в терміналі операційної системи.

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

Однорядкові програми Perl можуть запускатися з командного рядка, без необхідності створювати та зберігати скрипт у файлі. Наприклад, однорядник у Perl для виведення усіх рядків із файлу file.txt, де є слово “example”:

perl -ne 'print if /example/' file.txt

У цьому прикладі команда perl запускає однорядкову програму, яка читає файл file.txt порядково (-ne) та виводить лише ті рядки, які містять слово “example”.

Розширення Perl

Стандартні можливості мови можна розширити за допомогою сторонніх модулів. Серед доповнень Perl можна виділити найпопулярніші розширення:

  • DBI. Модуль для доступу до різних баз даних, включаючи MySQL, PostgreSQL, Oracle и SQLite.
  • Catalyst. Вебфреймворк для розробки вебзастосунків Perl.
  • Moose. Об’єктно-орієнтований фреймворк для Perl.
  • DateTime. Модуль для роботи з датами та часом у Perl.
  • CGI. Модуль для створення вебзастосунків Perl.
  • LWP. Модуль для доступу до вебресурсів з Perl, включаючи роботу з HTTP, HTTPS и FTP.
  • MooseX::Declare. Модуль, який додає декларативні можливості у MooseРозширення для Perl 5, що дозволяють спростити реалізацію ООП..
  • BioPerl. Набір модулів для роботи з біологічними даними Perl.
  • Template Toolkit. Потужний двигун шаблонів дляPerl.
  • Test::More. Модуль для модульного тестування Perl-коду.

Ці та інші модулі можуть бути встановлені з репозиторію доповнень. Найбільш популярний репозиторій доповнень Perl — CPAN (Comprehensive Perl Archive Network). Це офіційний репозиторій Perl, який містить понад 200 тисяч модулів Perl, які можуть бути встановлені та використані у Perl-проєктах.

CPAN — також головне джерело документації та прикладів коду на Perl. CPAN був створений у 1995 році і протягом більш ніж 25 років продовжує бути головним ресурсом для Perl-розробників.

Репозиторій пропонує зручний спосіб встановлення модулів Perl, використовуючи менеджери модулів Perl — CPAN.pm або cpanminus (cpanm). Ці менеджери модулів автоматично завантажують, встановлюють та оновлюють модулі Perl з CPAN.

Переваги та недоліки Perl

Perl дуже гнучкий та простий, а його синтаксичні конструкції зрозумілі навіть програмісту-початківцю, тому поріг входження — низький.

Але в останні роки Perl все більше поступається своїм конкурентам: Python, Ruby та Java. Все тому, що Perl не має такого рівня безпеки, як вони, і він може бути вразливий до атак.

Крім того, у Python и Java більш різноманітна стандартна бібліотека, а у Perl — більш вузькоспеціалізовані модулі. Але це може бути як перевагою, так і недоліком, залежно від проєкту.

Ще одна ахіллесова п’ята цієї мови — проблеми з багатопоточністю, які можуть знижувати продуктивність при обробці великих обсягів даних. Це пов’язано з тим, що Perl використовує модель потоків із блокуваннями для синхронізації між потоками.

Для поліпшення продуктивності багатопоточної обробки Perl можна скористатися такими модулями як Thread::Queue или Thread::Pool.

Крім того, Perl має безліч інших інструментів та модулів, які можуть бути використані для оптимізації продуктивності, наприклад, модулі для паралельної обробки даних, оптимізації роботи з пам’яттю тощо.

Другий недолік мови — обмежена підтримка Unicode, що може призвести до проблем під час роботи з багатьма мовами та символами.

Висновок

Незважаючи на вразливість у плані безпеки, Perl досить зручний для роботи, особливо як інструмент для системного адміністрування — управління та конфігурування систем, налаштування мережі, управління користувачами та групами, службами тощо.

Perl можна використовувати для автоматизації різних завдань, таких як резервне копіювання файлів, керування базами даних, автоматичний збір даних з Інтернету. Також за його допомогою можна проводити обробку інформації у форматі CSV та XML.

Крім того, він добре підходить для вирішення наукових та математичних завдань, наприклад, для статистичного аналізу та моделювання.

Якщо ви вирішите вивчити Perl, ми рекомендуємо вам переглянути тригодинний курс з основ цієї мови:

Останні статті

Brave1 збільшив гранти для оборонних розробок: можна отримати до 2 млн гривень

Кластер Brave1 збільшує гранти для оборонних розробок — тепер можна отримати від 500 тис до…

10.05.2024

Softserve, Luxoft та Infopulse. З’явився рейтинг найбільших платників податків серед IT-компаній

За 2023 рік IT-компанії сплатили сплатили в державний бюджет 20,8 мільярда гривень податків. Це 7,4%…

10.05.2024

«За заслуги перед компанією»: Microsoft розморозить підвищення зарплат співробітникам

Корпорація Microsoft планує відновити підвищення зарплат для найбільш ефективних співробітників. Про це повідомив Insider. Вірогідне…

10.05.2024

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

Міністерство економіки запропонувало виробникам дронів пільгові гранти від держави за програмою «Переробка». Про це йдеться…

09.05.2024

Дочекалися. В квітні попит на айтівців без досвіду був вищий, ніж на досвідчених фахівців

В квітні попит на недосвідчених айтівців був вищий, аніж на тих, хто має 3-4 роки…

09.05.2024

Dell буде відстежувати переміщення та присвоювати рейтинг «прогульникам» офісу

Американська компанія Dell після зміни політики щодо ремоуту посилює контроль за працівниками. Зокрема, відстежує фізичне…

09.05.2024