Перейти до вмісту

Perl

Матеріал з K2 ERP Wiki Ukraine — База знань з автоматизації та санкцій в Україні

SEO title: Perl — мова програмування для скриптів, текстової обробки, автоматизації, DevOps і legacy-систем SEO description: Perl — Wiki-стаття про динамічну скриптову мову програмування, відому потужною роботою з текстом, регулярними виразами, системним адмініструванням і автоматизацією. Розглянуто Perl 5, CPAN, синтаксис, scalars, arrays, hashes, references, modules, packages, регулярні вирази, file handling, one-liners, CGI, Mojolicious, DBI, тестування, переваги, обмеження і хороші практики. SEO keywords: Perl, мова програмування Perl, Perl programming language, Perl 5, CPAN, скриптинг, регулярні вирази, text processing, automation, DevOps, system administration, one-liners, scalar, array, hash, references, modules, packages, DBI, CGI, Mojolicious, Dancer, testing, TAP, програмування Alternative to: ручна обробка текстових файлів; складні shell-скрипти; ручна автоматизація системних задач; одноразові текстові трансформації без коду; застарілі CGI-рішення без структури; регулярні задачі адміністрування без скриптів; ручний аналіз логів; прості ETL-операції без автоматизації


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 — це мова практичної автоматизації й тексту. Вона найкраще працює там, де потрібно швидко й гнучко обробляти файли, логи, регулярні вирази та системні задачі.

Див. також

Тематичні мітки