Close-up view of curious camel against sand dunes of desert, Sultanate of Oman.
Сегодня мы вкратце рассмотрим такой язык программирования как 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 — 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 все больше уступает своим конкурентам: Python, Ruby и Java. Все потому, что у Perl нет такого уровня безопасности, как у них, и он может быть уязвим к атакам.
Кроме того, у Python и Java более разнообразная стандартная библиотека, а у Perl — более узкоспециализированные модули. Но это может быть как преимуществом, так и недостатком, в зависимости от проекта.
Еще одна ахиллесова пята этого языка — проблемы с многопоточностью, которые могут снижать производительность при обработке больших объемов данных. Это связано с тем, что Perl использует модель потоков с блокировками для синхронизации между потоками.
Для улучшения производительности многопоточной обработки в Perl можно воспользоваться такими модулями как Thread::Queue или Thread::Pool.
Кроме того, у Perl есть множество других инструментов и модулей, которые могут быть использованы для оптимизации производительности, например, модули для параллельной обработки данных, оптимизации работы с памятью и т.д.
Другой недостаток языка — ограниченная поддержка Unicode, что может привести к проблемам при работе с многими языками и символами.
Несмотря на уязвимости в плане безопасности, Perl достаточно удобный для работы, особенно как инструмент для системного администрирования — управления и конфигурирования систем, настройки сети, управления пользователями и группами, службами и т.д.
Perl можно использовать для автоматизации различных задач, таких как резервное копирование файлов, управление базами данных, автоматический сбор данных из Интернета, Также с его помощью можно проводить обработку информации в формате CSV и XML.
Кроме того, он хорошо подходит для решения научных и математических задач, например, для статистического анализа и моделирования.
Если вы решите изучить Perl, мы рекомендуем вам посмотреть трехчасовой курс по основам этого языка:
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…