Это не Perl вашего дедушки. Часть 1

Если бы вы искали в Интернете последние статьи о Perl, вы вполне могли бы поверить, что язык не изменился за последние двадцать лет. И, к сожалению, это вполне понятное убеждение, поскольку номер основной версии не менялся с 1994 года.

В июле 2000 года Perl 6 был объявлен следующей версией Perl. В течение следующих нескольких лет масштабы проекта расширялись, пока не стало очевидно, что Perl 6 не будет эволюцией Perl 5, а, скорее, революционным новым языком, уходящим своими корнями в Perl. Затем повествование было изменено, чтобы описать Perl 6 как новый язык в семействе Perl.

Производственная версия Perl 6 была выпущена в конце 2015 года, а в 2019 году разработчики смирились с неизбежным и переименовали язык в Raku, чтобы подчеркнуть его отличие от Perl.

Все это означало, что в течение почти двадцати лет у Perl не было следующего номера версии. И это, что неудивительно, привело к тому, что значительная часть отрасли предположила, что Perl не сильно изменился за это время. К сожалению, Perl претерпел огромные изменения в новом тысячелетии. Команда Perl 5 разработала годовой цикл выпуска, при котором новая версия выпускается примерно в мае каждого года. Версия 5.36 была выпущена в мае 2022 года и сильно отличается от версии 5.6.0, которая была актуальна еще летом 2000 года. В этой статье мы рассмотрим некоторые новые функции Perl, которые вы могли пропустить.

Получение более новой версии

Большинство систем Linux поставляются с уже установленной версией Perl. В зависимости от того, какой дистрибутив и какую версию этого дистрибутива вы используете, вы получите разные версии Perl. Иногда это довольно старые версии Perl. Я рекомендую вам освободиться от ограничений использования системной версии Perl. Это не только позволяет вам выбрать версию Perl, которую вы используете, но также предотвращает загрязнение системного Perl установкой расширений, которые могут быть несовместимы с ним. Поскольку системный Perl часто используется для выполнения важных задач по обслуживанию системы, вы, очевидно, хотите, чтобы он работал как можно более плавно.

По этой причине обычно рекомендуется установить собственную версию Perl. Есть несколько способов сделать это. Наиболее популярными подходами являются сборка и установка собственной версии Perl (она часто устанавливается в /opt/perl) или запуск приложения в отдельном контейнере с помощью Docker. Для любого из этих вариантов у команды Perl есть инструменты, которые помогут вам. Perlbrew — это инструмент для установки нескольких версий Perl и управления ими. В Docker-хабе доступно несколько официальных образов Perl.

Доступ к новым функциям

Команда разработчиков Perl считает, что обратная совместимость очень важна. Они сделают все, что в их силах, чтобы гарантировать, что новые версии Perl не нарушат старый код. В большинстве случаев им это удается; иногда нет.

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

Есть два способа включить функции. Если вы добавите в свой код «use », то он включит все функции, которые были введены в этой версии Perl (и во всех предыдущих версиях). Кроме того, все защищенные функции имеют имя, которое можно использовать с «use feature », чтобы включить эту конкретную функцию. Например, если вы хотите использовать команду say() (которую мы рассмотрим в следующем разделе), вы можете использовать:
use 5.36; #Включает все новые функции 5.36 (и более ранних версий)

Также вы можете использовать:
use feature 'say'; #Просто включает функцию "say"

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

Итак, что нового?

Итак, мы получили доступ к более новой версии Perl. О чем суета? Какие новые функции мы можем использовать? Начнем с небольшой функции, которую я использую в большинстве программ Perl, которые пишу.

say()
Вы, несомненно, знакомы с использованием функции print() для вывода данных на консоль или для записи их в файл. В Perl 5.10 появилась команда say(), которая делает то же самое, но автоматически добавляет к выходным данным символ новой строки.

Вроде мелочь, но на удивление полезная. Сколько раз вы печатаете строку данных в файл и должны помнить о явном добавлении новой строки? Это просто делает вашу жизнь немного проще. Вместо ввода:
print "Это некоторые данные: $data\n";

Вы можете использовать:
say "Это некоторые данные: $data";

Это было добавлено в Perl 5.10 и может быть включено с помощью функции «use feature 'say'».

Лексические дескрипторы файлов

Некоторые улучшения были необходимы, потому что в некоторых местах наследие Perl Unix/C проявляется немного больше, чем нам хотелось бы в 21 веке. Одним из хороших примеров этого являются файловые дескрипторы bareword. Вы, вероятно, использовали код Perl, чтобы открыть файл, который выглядит так:
open FH, 'filename.dat' or die;

Здесь мы открываем файл «filename.dat» и связываем этот файл с дескриптором файла с именем FH. Затем мы можем прочитать данные из файла, читая из дескриптора файла FH.

Проблема в том, что FH является переменной. Он не выглядит как переменная, потому что не начинается с символа $, @ или %, как большинство переменных Perl. Но это переменная. И, что еще хуже, это пакетная переменная (которая ближе всего к глобальной переменной в Perl). Вы можете подумать, что, поскольку вы открываете и читаете свой файл внутри подпрограммы, вы используете дескриптор файла, который существует только внутри этой подпрограммы. Но нет. Вы создали дескриптор файла, который доступен практически в любом месте вашей программы. И это не очень хорошая практика программирования.

Итак, долгое время (по крайней мере, начиная с Perl 5.6) можно было открывать дескрипторы файлов и сохранять их в лексических переменных (тип Perl-переменных, который существует только в определенном блоке кода и, следовательно, является наиболее разумным типом). переменной для использования в большинстве случаев). Правило состоит в том, что если вы используете скалярную переменную, которая не содержит данных («неопределенная» на языке Perl) вместо дескриптора файла в вызове open(), то дескриптор файла сохраняется в этой скалярной переменной. Самый простой способ убедиться, что переменная не определена, — это объявить ее там, где вы впервые хотите ее использовать, поэтому приведенный выше код можно заменить чем-то вроде этого:

#Лексические переменные объявляются с использованием "my"
open my $fh, 'filename.dat' or die;

Затем вы можете использовать $fh точно так же, как вы использовали FH в предыдущем коде, с тем преимуществом, что вы не загрязняете свою таблицу символов нежелательными переменными.

Есть и еще одно преимущество. Переменная $fh ограничена блоком, в котором она объявлена. Когда вы покидаете этот блок, переменная выходит за пределы области видимости и уничтожается. Для скалярной переменной, содержащей дескриптор файла, файл, связанный с дескриптором файла, автоматически закрывается, что дает вам на одну проблему меньше.
Поделиться:

Похожие публикации

Тут ничего нет

Нет комментариев