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

Не 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, мы рекомендуем вам посмотреть трехчасовой курс по основам этого языка:

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

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023