Perl
Perl — це динамічна скриптова мова програмування, відома сильною підтримкою текстової обробки, регулярних виразів, системної автоматизації, роботи з файлами, one-liners, DevOps-скриптів і legacy-систем.
Perl довгий час була однією з головних мов для системного адміністрування, web CGI, обробки логів, автоматизації Unix/Linux-задач, генерації звітів і швидкого написання утиліт.
Основна ідея: Perl створена для практичної автоматизації: швидко прочитати текст, знайти pattern, перетворити дані, обробити файли й виконати системну задачу.
Загальний опис
Perl часто описують як мову, яка поєднує можливості shell scripting, awk, sed, C і високорівневих структур даних. Вона особливо сильна там, де потрібно багато працювати з текстом, файлами, регулярними виразами й системними командами.
Perl використовується для:
- text processing;
- parsing;
- регулярних виразів;
- системного адміністрування;
- DevOps-скриптів;
- обробки логів;
- one-liners;
- automation;
- ETL;
- legacy web systems;
- CGI;
- bioinformatics;
- network scripts;
- тестових інструментів;
- швидких утиліт;
- glue code між системами.
Перевага: Perl дозволяє дуже швидко написати скрипт для задачі, де вручну довелося б довго редагувати, шукати, фільтрувати або перетворювати текстові дані.
Історія Perl
Perl була створена Ларрі Воллом як практична мова для обробки текстів, звітів і системних задач. Вона стала дуже популярною в Unix/Linux-середовищі, web-розробці 1990-х років, CGI-скриптах, системному адмініструванні й автоматизації.
Ключові історичні напрями:
- заміна складних shell scripts;
- потужні регулярні вирази;
- швидка обробка тексту;
- CGI web programming;
- CPAN-екосистема;
- системна автоматизація;
- bioinformatics;
- legacy enterprise scripts.
Важливо: Perl має велику legacy-базу. Навіть якщо нові проєкти часто обирають Python, Ruby, Go або JavaScript, Perl усе ще зустрічається в старих системах, автоматизації й інфраструктурних скриптах.
Perl 5
Perl 5 — основна й найпоширеніша гілка Perl, яка десятиліттями використовувалась у production.
Perl 5 має:
- скаляри;
- масиви;
- хеші;
- references;
- modules;
- packages;
- регулярні вирази;
- об’єктний стиль;
- CPAN;
- потужну роботу з файлами;
- сумісність із великою legacy-екосистемою.
Практична роль: коли говорять про Perl у більшості production і legacy-контекстів, зазвичай мають на увазі Perl 5.
Perl 6 і Raku
Історично існував проєкт Perl 6, який згодом став окремою мовою Raku.
Raku не є просто наступною версією Perl 5. Це окрема мова з власним дизайном, типами, граматиками, concurrency-моделлю й екосистемою.
Увага: Perl 5 і Raku — різні мови. У legacy-системах майже завжди йдеться саме про Perl 5.
Перша програма на Perl
Простий приклад:
use strict;
use warnings;
print "Hello, world!\n";
Запуск:
perl hello.pl
У цьому прикладі:
- `use strict;` вимагає дисциплінованого оголошення змінних;
- `use warnings;` вмикає попередження;
- `print` виводить текст;
- `\n` додає новий рядок.
Головне правило для старту: майже кожен Perl-скрипт варто починати з `use strict;` і `use warnings;`.
Синтаксис
Perl має виразний, але іноді незвичний синтаксис. Однією з особливостей є sigils — спеціальні символи перед змінними.
Основні sigils:
- `$` — scalar;
- `@` — array;
- `%` — hash;
- `&` — subroutine у деяких контекстах;
- `*` — typeglob у спеціальних сценаріях.
Приклад:
my $name = "Alice";
my @items = ("A", "B", "C");
my %user = (
name => "Alice",
age => 25,
);
Суть sigils: символ перед змінною показує, з яким типом контейнера або значення працює код.
use strict і use warnings
`use strict;` і `use warnings;` — базові захисні практики Perl.
Приклад:
use strict;
use warnings;
my $count = 10;
print "$count\n";
`strict` допомагає уникати:
- випадкових глобальних змінних;
- помилок у назвах змінних;
- небезпечних symbolic references;
- частини неочевидної поведінки.
`warnings` показує попередження про потенційні помилки.
Критично: Perl без `strict` і `warnings` може дозволити помилки, які важко знайти. Для підтримуваного коду ці директиви майже обов’язкові.
Scalars
Scalar — це одиничне значення. Scalar-змінна починається з `$`.
Приклад:
my $name = "Alice";
my $age = 25;
my $price = 19.99;
print "$name is $age years old\n";
Scalar може містити:
- рядок;
- число;
- reference;
- undefined value;
- інші одиничні значення.
Практична роль: scalar — базова одиниця даних у Perl.
Arrays
Array — впорядкований список значень. Array-змінна починається з `@`.
Приклад:
my @items = ("A", "B", "C");
print $items[0], "\n";
print $items[1], "\n";
Індексація масивів починається з 0.
Додавання елементів:
push @items, "D";
my $last = pop @items;
Суть array: масив зберігає список значень і зручний для рядків файлу, аргументів, результатів пошуку й наборів даних.
Hashes
Hash — key-value структура. Hash-змінна починається з `%`.
Приклад:
my %user = (
name => "Alice",
age => 25,
);
print $user{name}, "\n";
print $user{age}, "\n";
Додавання значення:
$user{status} = "active";
Прохід по hash:
for my $key (keys %user) {
print "$key = $user{$key}\n";
}
Практична роль: hash — одна з найкорисніших структур Perl для конфігурацій, лічильників, lookup-таблиць і парсингу даних.
undef
`undef` означає невизначене значення.
Приклад:
my $value;
if (!defined $value) {
print "Value is undefined\n";
}
Перевірка:
defined $value
Важливо: `undef` не те саме, що порожній рядок або нуль. Для перевірки краще використовувати `defined`.
Контекст
У Perl важливе поняття context.
Один і той самий вираз може поводитися по-різному в:
- scalar context;
- list context;
- void context.
Приклад:
my @items = ("A", "B", "C");
my $count = @items;
my @copy = @items;
print "$count\n";
У scalar context масив повертає кількість елементів.
Складність Perl: context робить мову дуже виразною, але може бути неочевидним для новачків.
Умови
Perl підтримує `if`, `elsif`, `else`.
Приклад:
my $age = 20;
if ($age >= 18) {
print "Adult\n";
} else {
print "Minor\n";
}
Коротка форма:
print "Adult\n" if $age >= 18;
Практична роль: postfix-умови в Perl зручні для коротких перевірок і простих one-liners.
Цикли
Perl має звичні цикли.
`for`:
for my $i (1..5) {
print "$i\n";
}
`foreach`:
my @items = ("A", "B", "C");
foreach my $item (@items) {
print "$item\n";
}
`while`:
my $count = 3;
while ($count > 0) {
print "$count\n";
$count--;
}
Практична роль: цикли Perl часто використовують для обробки рядків файлів, списків і потоків тексту.
Subroutines
Subroutine — функція або процедура в Perl.
Приклад:
sub add {
my ($a, $b) = @_;
return $a + $b;
}
my $result = add(2, 3);
print "$result\n";
Аргументи передаються через спеціальний масив `@_`.
Суть subroutine: sub дозволяє винести повторювану логіку в окрему функцію й зробити код підтримуванішим.
References
Reference — це посилання на іншу структуру даних.
Reference потрібні для:
- вкладених структур;
- передачі великих даних без копіювання;
- об’єктів;
- складних hash/array структур;
- модулів;
- callbacks.
Приклад array reference:
my $items_ref = ["A", "B", "C"];
print $items_ref->[0], "\n";
Приклад hash reference:
my $user_ref = {
name => "Alice",
age => 25,
};
print $user_ref->{name}, "\n";
Увага: references є ключем до складних структур Perl, але синтаксис `->` може бути незвичним для новачків.
Nested data structures
Perl дозволяє створювати вкладені структури.
Приклад:
my $company = {
name => "Example",
users => [
{ name => "Alice", role => "admin" },
{ name => "Bob", role => "user" },
],
};
print $company->{users}->[0]->{name}, "\n";
Практична роль: вкладені hashes і arrays зручні для JSON-подібних даних, конфігурацій, API-відповідей і parsed structures.
Регулярні вирази
Регулярні вирази — одна з найсильніших сторін Perl.
Пошук pattern:
my $text = "user@example.com";
if ($text =~ /@/) {
print "Looks like email\n";
}
Заміна:
my $text = "Hello world";
$text =~ s/world/Perl/;
print "$text\n";
Витягування груп:
my $line = "Name: Alice";
if ($line =~ /Name:\s+(\w+)/) {
print "Found name: $1\n";
}
Головна сила Perl: регулярні вирази є природною частиною мови, тому Perl дуже зручна для пошуку, заміни й парсингу тексту.
Match operator =~
Оператор `=~` прив’язує регулярний вираз до змінної.
Приклад:
my $text = "abc123";
if ($text =~ /\d+/) {
print "Contains digits\n";
}
Без `=~` regex часто застосовується до спеціальної змінної `$_`.
Суть `=~`: оператор показує, до якого саме тексту застосовується pattern.
Спеціальна змінна $_
`$_` — спеціальна змінна за замовчуванням у Perl.
Приклад:
while (<STDIN>) {
print if /error/i;
}
Тут регулярний вираз і `print` працюють із `$_`.
Важливо: `$_` робить Perl-код коротким, але надмірне використання може зменшити читабельність.
File handling
Perl дуже зручна для роботи з файлами.
Читання файлу:
use strict;
use warnings;
open my $fh, "<", "data.txt" or die "Cannot open file: $!";
while (my $line = <$fh>) {
chomp $line;
print "$line\n";
}
close $fh;
Запис у файл:
open my $out, ">", "output.txt" or die "Cannot write file: $!";
print $out "Hello from Perl\n";
close $out;
Практична роль: Perl часто використовують саме для читання, фільтрації, перетворення й запису текстових файлів.
chomp
`chomp` видаляє символ нового рядка з кінця рядка.
Приклад:
my $line = "Hello\n";
chomp $line;
print "$line!";
Без `chomp` обробка рядків із файлів часто дає зайві перенесення.
Практична роль: `chomp` є однією з найчастіших команд під час обробки текстових файлів у Perl.
split і join
`split` розбиває рядок на частини.
my $line = "Alice,25,active";
my @fields = split /,/, $line;
print $fields[0], "\n";
`join` об’єднує список у рядок.
my @fields = ("Alice", 25, "active");
my $line = join ",", @fields;
print "$line\n";
Практична користь: split і join — базові інструменти для CSV-подібних файлів, логів і простих текстових форматів.
One-liners
Perl популярна для one-liners — коротких команд у shell.
Приклад: вивести рядки з помилками:
perl -ne 'print if /error/i' app.log
Заміна тексту:
perl -pi -e 's/old/new/g' file.txt
Порахувати рядки:
perl -ne '$count++; END { print "$count\n" }' file.txt
Суть one-liners: Perl можна використовувати як потужний command-line інструмент для швидкої обробки тексту без окремого скриптового файлу.
CPAN
CPAN або Comprehensive Perl Archive Network — великий репозиторій Perl-модулів.
CPAN містить модулі для:
- web development;
- databases;
- JSON;
- XML;
- testing;
- networking;
- parsing;
- system administration;
- email;
- logging;
- dates;
- security;
- bioinformatics;
- automation.
Встановлення модуля може виконуватися через CPAN-клієнти або інструменти на кшталт `cpanm`.
Перевага CPAN: Perl має одну з найстаріших і найширших бібліотечних екосистем для практичних задач автоматизації.
Modules
Module у Perl — файл із reusable кодом.
Приклад використання модуля:
use JSON;
my $data = { name => "Alice", age => 25 };
my $json = encode_json($data);
print "$json\n";
Модулі допомагають:
- розділяти код;
- повторно використовувати логіку;
- підключати бібліотеки;
- організовувати packages;
- тестувати частини системи.
Практична роль: модулі перетворюють Perl-скрипти з одноразових файлів на підтримувану структуру коду.
Packages
Package задає namespace у Perl.
Приклад:
package MyApp::Utils;
use strict;
use warnings;
sub add {
my ($a, $b) = @_;
return $a + $b;
}
1;
Файл модуля зазвичай завершується `1;`, щоб повернути true value при завантаженні.
Увага: `package` — це namespace, а не файл сам по собі. Але в практиці Perl назви packages часто відповідають шляхам файлів модулів.
Об’єктно-орієнтований Perl
Perl підтримує об’єктно-орієнтований стиль, хоча його модель відрізняється від класичних мов.
Простий приклад:
package User;
use strict;
use warnings;
sub new {
my ($class, %args) = @_;
return bless \%args, $class;
}
sub name {
my ($self) = @_;
return $self->{name};
}
1;
Використання:
my $user = User->new(name => "Alice");
print $user->name, "\n";
Суть OOP у Perl: об’єкт часто є blessed reference, а методи — subroutines у package.
bless
`bless` прив’язує reference до package, перетворюючи його на об’єкт.
Приклад:
my $self = {
name => "Alice",
};
bless $self, "User";
Важливо: класичний Perl OOP дуже гнучкий, але потребує дисципліни. Для сучаснішого стилю часто використовують Moose, Moo або інші модулі.
Moose і Moo
Moose — потужна об’єктна система для Perl.
Moo — легший варіант для простішого OOP.
Вони додають:
- attributes;
- constructors;
- type constraints;
- roles;
- method modifiers;
- cleaner object syntax;
- менше ручного boilerplate.
Приклад ідеї з Moo:
package User;
use Moo;
has name => (
is => "ro",
required => 1,
);
1;
Практична роль: Moose і Moo роблять об’єктний Perl більш структурованим і зручним для великих проєктів.
DBI
DBI — стандартний підхід Perl для роботи з базами даних.
DBI дозволяє працювати з:
- PostgreSQL;
- MySQL/MariaDB;
- SQLite;
- Oracle;
- SQL Server;
- іншими базами через драйвери DBD.
Приклад:
use DBI;
my $dbh = DBI->connect(
"dbi:SQLite:dbname=data.db",
"",
"",
{ RaiseError => 1, AutoCommit => 1 }
);
my $rows = $dbh->selectall_arrayref(
"SELECT id, name FROM users",
{ Slice => {} }
);
for my $row (@$rows) {
print "$row->{id}: $row->{name}\n";
}
Практична роль: DBI є важливою частиною Perl-екосистеми для database scripts, reporting і backend legacy-систем.
CGI
CGI — історичний спосіб запуску web-скриптів на сервері.
Perl довгий час був дуже популярним для CGI.
Простий приклад ідеї:
print "Content-Type: text/plain\n\n";
print "Hello from CGI\n";
Історична роль: Perl був однією з головних мов ранньої web-розробки через CGI, але для нових web-проєктів зазвичай обирають сучасніші фреймворки й підходи.
Mojolicious
Mojolicious — сучасний Perl web framework.
Він використовується для:
- web applications;
- REST API;
- real-time apps;
- WebSockets;
- prototypes;
- internal tools;
- modern Perl web development.
Простий приклад:
use Mojolicious::Lite;
get "/" => sub {
my $c = shift;
$c->render(text => "Hello from Mojolicious");
};
app->start;
Практична роль: Mojolicious показує, що Perl може використовуватися не лише для legacy CGI, а й для сучасніших web API і застосунків.
Dancer
Dancer — легкий web framework для Perl.
Dancer підходить для:
- невеликих web apps;
- REST API;
- internal tools;
- простих web-сервісів;
- прототипів.
Приклад:
use Dancer2;
get "/" => sub {
return "Hello from Dancer";
};
start;
Практична роль: Dancer дає простий DSL для web routes і невеликих web-застосунків на Perl.
Testing
Perl має сильну культуру тестування.
Основні інструменти:
- `Test::More`;
- `prove`;
- TAP;
- `Test::Simple`;
- `Test::Exception`;
- `Test::Deep`;
- `Test::MockModule`.
Приклад:
use strict;
use warnings;
use Test::More;
is(2 + 3, 5, "addition works");
done_testing();
Запуск:
prove -v t/
Перевага: Perl має зрілу testing-культуру, особливо через TAP і модулі Test::*.
TAP
TAP або Test Anything Protocol — простий формат виводу тестів, який став важливою частиною Perl-екосистеми.
TAP дозволяє:
- запускати тести;
- збирати результати;
- інтегрувати різні test runners;
- бачити pass/fail;
- працювати з CI.
Практична роль: TAP зробив Perl-тести простими, переносимими й зручними для автоматизації.
System administration
Perl часто використовують для системного адміністрування.
Типові задачі:
- обробка логів;
- пошук pattern у файлах;
- backup scripts;
- renaming files;
- monitoring helpers;
- parsing command output;
- generating reports;
- file cleanup;
- user management scripts;
- cron jobs;
- integration scripts.
Практична роль: Perl є класичним інструментом Unix/Linux-адміністрування, особливо для текстових і файлових задач.
Робота з системними командами
Perl може запускати зовнішні команди.
Приклад через backticks:
my $output = `date`;
print $output;
Приклад через `system`:
system("ls", "-la");
Критично: не можна без перевірки передавати користувацький input у shell-команди. Це може створити command injection.
Perl і регулярна автоматизація
Perl добре підходить для задач, які запускаються через cron або scheduler.
Приклади:
- щоденний звіт;
- обробка логів за ніч;
- експорт CSV;
- перевірка файлів;
- email notification;
- cleanup temporary directories;
- синхронізація даних;
- перевірка статусів;
- генерація HTML або текстових звітів.
Практична користь: Perl-скрипт часто є простим і надійним способом автоматизувати регулярну системну або офісну задачу.
Perl і біоінформатика
Perl історично популярний у bioinformatics.
Використання:
- parsing FASTA/FASTQ;
- обробка sequence data;
- text-heavy research files;
- pipeline scripts;
- legacy bioinformatics tools;
- conversion scripts;
- data cleanup;
- report generation.
Важлива екосистема:
- BioPerl;
- CPAN-модулі для science data;
- legacy research scripts.
Практична роль: Perl став популярним у біоінформатиці через сильну роботу з текстовими форматами й швидке написання pipeline-скриптів.
Perl і Unix pipeline
Perl добре поєднується з Unix pipeline.
Приклад:
cat app.log | perl -ne 'print if /timeout/i' | sort | uniq -c
Perl може бути проміжним фільтром між командами:
- `cat`;
- `grep`;
- `awk`;
- `sed`;
- `sort`;
- `uniq`;
- `find`;
- `xargs`.
Практична порада: Perl особливо корисний, коли `grep`, `sed` або `awk` уже стають занадто незручними для складнішої логіки.
Perl і Python
Perl часто порівнюють із Python.
| Критерій | Perl | Python |
|---|---|---|
| Основна історична ніша | Text processing, sysadmin, CGI, automation | General-purpose programming, automation, data science, web, AI |
| Синтаксис | Дуже гнучкий, іноді щільний | Більш явний і структурований |
| Регулярні вирази | Дуже природні в мові | Потужні через модуль `re` |
| Екосистема | CPAN, legacy scripts | Дуже широка сучасна екосистема |
| Нові проєкти | Рідше | Частіше |
Висновок: Perl часто сильніший у коротких текстових скриптах і legacy automation, а Python частіше обирають для нових універсальних проєктів.
Perl і shell scripting
Perl часто замінює складні shell scripts.
| Критерій | Perl | Shell |
|---|---|---|
| Складна логіка | Зручніша | Може швидко стати складною |
| Text processing | Дуже сильна | Сильна через grep/sed/awk |
| Структури даних | Arrays, hashes, references | Обмежені |
| Портативність | Добра за наявності Perl | Залежить від shell і команд |
| One-liners | Дуже сильні | Також сильні |
Висновок: якщо shell-скрипт стає занадто складним через умови, масиви, parsing і регулярні вирази, Perl може бути кращим варіантом.
Perl і Ruby
Perl і Ruby мають спільну історичну близькість у scripting і text processing.
| Критерій | Perl | Ruby |
|---|---|---|
| Історичний фокус | Text processing, sysadmin, CGI | Developer happiness, OOP, Rails |
| Web | CGI, Mojolicious, Dancer | Ruby on Rails, Sinatra |
| Синтаксис | Гнучкий і щільний | Виразний і читабельний |
| Legacy | Дуже багато системних скриптів | Багато Rails-застосунків |
| Основна асоціація | Automation і regex | Web development і DSL |
Висновок: Perl часто сильніший у системній автоматизації й текстовій обробці, Ruby — у web development і виразному об’єктному коді.
Perl і awk/sed
Perl часто використовують як потужнішу альтернативу awk і sed.
| Критерій | Perl | awk/sed |
|---|---|---|
| Простий пошук і заміна | Добре | Дуже добре |
| Складні структури даних | Є arrays, hashes, references | Обмежено |
| Багатофайлова логіка | Зручна | Складніша |
| Скрипти | Повноцінна мова | Спеціалізовані інструменти |
Практичний висновок: awk і sed чудові для простих pipeline-задач, але Perl зручніший, коли потрібна повноцінна логіка програми.
Переваги Perl
Основні переваги Perl:
- потужні регулярні вирази;
- сильна текстова обробка;
- швидке написання скриптів;
- arrays і hashes;
- CPAN;
- one-liners;
- добра інтеграція з Unix;
- зручна робота з файлами;
- системна автоматизація;
- legacy-сумісність;
- DBI;
- testing ecosystem;
- гнучкість;
- підходить для glue code.
Головна перевага: Perl дуже швидко вирішує практичні задачі тексту, файлів, логів і автоматизації.
Обмеження Perl
Perl має обмеження.
Можливі проблеми:
- складна читабельність погано написаного коду;
- багато стилів написання;
- менша популярність у нових проєктах;
- legacy-репутація;
- щільний синтаксис;
- неочевидний context;
- спеціальні змінні можуть заплутувати;
- OOP у базовому Perl менш очевидний;
- підтримка старих скриптів може бути складною;
- менша кадрова база, ніж у Python або JavaScript;
- сучасні web/AI напрями частіше обирають інші мови.
Помилка: писати Perl як набір “магічних” коротких виразів без структури. Такий код може працювати, але бути майже непридатним для підтримки.
Коли варто використовувати Perl
Perl доречно використовувати для:
- підтримки legacy Perl-систем;
- text processing;
- log analysis;
- one-liners;
- системної автоматизації;
- Unix/Linux scripts;
- quick data conversion;
- регулярних виразів;
- простих ETL;
- DBI scripts;
- bioinformatics legacy;
- CGI legacy;
- glue code;
- задач, де CPAN уже має потрібний модуль.
Практична порада: Perl варто обирати, якщо задача переважно текстова, файлова, системна або пов’язана з існуючим Perl-кодом.
Коли Perl може бути невдалим вибором
Perl може бути не найкращим вибором для:
- нових web-проєктів без legacy-вимог;
- AI/ML;
- frontend;
- mobile development;
- великих команд без Perl-досвіду;
- проєктів, де важлива широка сучасна кадрова база;
- систем, де Python, Go, JavaScript або Java краще вписуються в стек;
- навчання програмуванню з нуля для більшості сучасних команд.
Важливо: Perl залишається корисним інструментом, але для нових великих систем вибір мови потрібно порівнювати з сучасним стеком команди.
Безпека Perl-скриптів
Perl-скрипти часто працюють із файлами, системними командами, логами й даними, тому безпека важлива.
Потрібно контролювати:
- command injection;
- небезпечний user input;
- SQL injection;
- file path traversal;
- permissions;
- secrets у скриптах;
- credentials;
- небезпечні regex;
- тимчасові файли;
- права запуску;
- CGI input;
- небезпечні CPAN-залежності.
Критично: Perl-скрипт, який запускає shell-команди або працює з користувацьким input, має перевіряти й екранувати дані.
Taint mode
Taint mode — механізм Perl для безпечнішої роботи з зовнішнім input.
Він допомагає виявляти небезпечне використання даних, отриманих ззовні.
Приклад запуску:
perl -T script.pl
Практична роль: taint mode історично важливий для CGI і скриптів, які обробляють недовірені дані.
Приватність даних
Perl-скрипти можуть обробляти чутливі файли, логи, персональні дані й credentials.
Потрібно обережно працювати з:
- логами;
- email;
- персональними даними;
- токенами;
- паролями;
- database credentials;
- backup files;
- тимчасовими файлами;
- CSV exports;
- web input;
- конфігураційними файлами.
Правило: Perl-скрипт не повинен випадково друкувати, логувати або зберігати секрети й персональні дані в незахищених місцях.
Хороші практики Perl
Рекомендовано:
- завжди використовувати `use strict;`;
- завжди використовувати `use warnings;`;
- оголошувати змінні через `my`;
- писати зрозумілі імена;
- не зловживати спеціальними змінними;
- уникати надмірно щільних one-liners у production;
- розділяти код на modules;
- писати тести;
- перевіряти помилки відкриття файлів;
- використовувати lexical filehandles;
- обережно запускати shell-команди;
- використовувати placeholders у SQL;
- документувати складні регулярні вирази;
- форматувати код;
- не зберігати secrets у скриптах.
Головне правило: хороший Perl-код має бути не лише коротким, а й читабельним, перевіреним, модульним і безпечним.
Типові помилки початківців
Поширені помилки:
- не використовувати `strict` і `warnings`;
- випадково створювати глобальні змінні;
- плутати scalar і list context;
- неправильно працювати з references;
- забувати `chomp`;
- плутати `$array[0]` і `@array`;
- писати занадто складні regex без пояснення;
- не перевіряти `open`;
- передавати input у shell без перевірки;
- використовувати `$_` там, де краще явна змінна;
- створювати unreadable one-liners;
- ігнорувати encoding;
- не писати тести.
Небезпека: Perl легко дозволяє написати код, який працює сьогодні, але через місяць його важко зрозуміти навіть автору.
Приклади задач на Perl
Фільтрація логів
use strict;
use warnings;
open my $fh, "<", "app.log" or die "Cannot open log: $!";
while (my $line = <$fh>) {
print $line if $line =~ /error/i;
}
close $fh;
Підрахунок частоти слів
use strict;
use warnings;
my %count;
while (my $line = <STDIN>) {
chomp $line;
for my $word (split /\s+/, $line) {
$count{lc $word}++;
}
}
for my $word (sort keys %count) {
print "$word: $count{$word}\n";
}
Читання CSV-подібного файлу
use strict;
use warnings;
open my $fh, "<", "users.csv" or die "Cannot open file: $!";
while (my $line = <$fh>) {
chomp $line;
my ($name, $age, $status) = split /,/, $line;
print "Name: $name, Age: $age, Status: $status\n";
}
close $fh;
Hash lookup
use strict;
use warnings;
my %roles = (
alice => "admin",
bob => "user",
);
my $name = "alice";
if (exists $roles{$name}) {
print "$name role: $roles{$name}\n";
}
Функція з перевіркою аргументів
use strict;
use warnings;
sub divide {
my ($a, $b) = @_;
die "Division by zero" if $b == 0;
return $a / $b;
}
print divide(10, 2), "\n";
Підказка: у Perl-прикладах важливо звертати увагу на context, references, regex, перевірку помилок і читабельність.
Джерела
- Офіційна документація Perl.
- perldoc.
- CPAN.
- Perl Maven.
- Modern Perl.
- Programming Perl.
- Learning Perl.
- Документація DBI.
- Документація Mojolicious.
- Документація Dancer2.
- Документація Test::More і TAP.
- Матеріали щодо Perl security, taint mode, регулярних виразів і системної автоматизації.
Висновок
Perl — це практична скриптова мова програмування, яка стала відомою завдяки сильній текстовій обробці, регулярним виразам, системній автоматизації, one-liners, CPAN і широкій legacy-базі. Вона добре підходить для логів, файлів, parsing, Unix/Linux scripts, database reports, glue code і підтримки старих систем.
Perl може бути дуже продуктивною мовою для досвідченого розробника, але потребує дисципліни: `strict`, `warnings`, зрозумілі імена, модулі, тести й обережність із regex та shell-командами. Для нових великих систем її часто порівнюють із Python, Go, JavaScript або Ruby, але для text processing і legacy automation Perl залишається важливим інструментом.
Головна думка: Perl — це мова практичної автоматизації й тексту. Вона найкраще працює там, де потрібно швидко й гнучко обробляти файли, логи, регулярні вирази та системні задачі.
Див. також
- Програмування
- Мова програмування
- Скриптова мова
- Shell scripting
- Python
- Ruby
- PHP
- Awk
- Sed
- Регулярні вирази
- CPAN
- CGI
- Mojolicious
- Dancer
- DBI
- Unix
- Linux
- Автоматизація
- DevOps
- Логування
- Налагодження коду
- Безпека застосунків