LINUX.ORG.RU

Perl 5.36.0

 


1

2

С момента выхода Perl 5.34.0 прошло около года.

Если исключить документацию, автоматически генерируемые файлы и инструментарий для формирования самого релиза, в новой версии изменено 190000 строк в 1300 файлах .pm, .t, .c и .h.

Видение дальнейшего развития языка наконец устоялось. В результате двухгодичных дискуссий, сотрясавших сообщество с момента анонса Perl 7, было решено:

  • Существующий код должен работать и в будущих версиях языка. По крайней мере написанный разумно код. Исключением может быть устранение уязвимостей, влекущее нарушение обратной совместимости.
  • Язык должен развиваться, а скорость добавления новых возможностей должна возрасти. Следствием этого решения является введение процедуры RFC, которая может использоваться для предложения изменений в языке любым желающим.
  • Использование новых функций должно упроститься и разработчики будут всячески способствовать тому, чтобы пользователи активней использовали нововведения.

Подробней о том «Что стало с Perl 7?» можно прочитать здесь.

Основные изменения

use v5.36

use v5.36 по умолчанию активирует прагму warnings и как обычно включает новые функции интерпретатора. В их числе:

Прагма signatures

Впервые появилась в версии 5.20.0, несколько раз изменялась и наконец перестала быть экспериментальной.

use v5.36;
 
sub add ($x, $y) {
  return $x + $y;
}

Тем не менее, некоторые элементы сигнатур не были стабилизированы. Например, использование массива @_ внутри функции с сигнатурами.

Оператор isa

Был представлен в версии 5.32.0, с тех пор не изменялся и теперь считается стабильным.

Оператор возвращает истину когда левый операнд является экземпляром класса указанного в правом операнде:

if( $obj isa Some::Class ) { ... }
 
if( $obj isa "Different::Class" ) { ... }
if( $obj isa $name_of_class ) { ... }

use v5.36 так же отключает ряд возможностей признанных нежелательными:

  • indirect — синтаксис непрямого вызова методов: new Foo 1, 2; # Foo->new(1,2);;
  • multidimensional — эмуляция многомерных массивов через хэши. Осуществляется через неявную конвертацию кода вида $foo{$x, $y} в $foo{ join($;, $x, $y)};
  • Структура switch находившаяся в экспериментальном состоянии с версии 5.10.

Новый флаг интерпретатора -g

Инициализирует переменную содержащую разделитель входящих строк ($/) неопределённым значением, что заставляет Perl считывать файлы не построчно, а целиком. Мнемоники для ключа: gobble, grab, gulp.

Поддержка Юникод 14.0

О нововведениях данной версии стандарта кодирования можно прочитать здесь.

Расширенные классы символов

Метапоследовательность позволяет писать более читаемый код и сокращает вероятность неправильного определения классов. Внутри неё могут использоваться операции над множествами. Метапоследовательность была добавлена в версии 5.18.0 и больше не является экспериментальной.

# Найдёт тайские или лаосские цифры
/(?[ ( \p{Thai} + \p{Lao} ) & \p{Digit} ])/
# Обратите внимание на пробелы!
# Внутри конструкции неявно активирован флаг /xx
#
# Операции над множествами:
#
# &    пересечение
# +    объединение
# |    тоже объединение
# -    вычитание
# ^    разность

В документации доступно больше примеров.

Обратный поиск произвольной длины

До 5.36.0 любые виды обратного поиска считались экспериментальными. В данной версии стабилизировано всё кроме поиска с захватом подстроки. Например:

"aaz"=~/(?=z)(?<=(a|aa))/

Разработчики ещё не решили окончательно что должно попадать в переменную $1 после отрабатывания кода ( «a» или «aa»). На данный момент выбирается самая длинная из возможных альтернатив, но не факт что это поведение сохранится в будущем.

Исправлена ошибка SIGFPE

Подробней можно прочитать здесь.

Отслеживание булевых значений

Булевы значения, обычно создаваемые с помощью !!0 и !!1, или возвращаемые разными встроенными функциями и операторами, теперь сохраняют свою булеву сущность даже после присваивания переменным. Новая экспериментальная функция is_bool() модуля builtin позволяет проверить является ли значение булевым.

Работа с несколькими значениями в цикле (экспериментально)

no warnings "experimental::for_list";
for my ($key, $value) (%hash) { ... }
for my ($left, $right, $gripping) (@moties) { ... }

Функция builtin::indexed может быть полезна для работы с циклами такого вида.

Экспериментальный модуль builtin

Функции из данного модуля доступны всегда.

say "Reference type of arrays is ", builtin::reftype([]);

Лексический импорт тоже возможен:

use builtin 'reftype';
say "Reference type of arrays is ", reftype([]);

Список функций модуля на текущий момент:

  • true;
  • false;
  • is_bool;
  • weaken;
  • unweaken;
  • is_weak;
  • blessed;
  • refaddr;
  • reftype;
  • ceil;
  • floor.

Подробная информация доступна в документации.

Экспериментальный блок defer

Позволяет объявлять сегменты кода, которые будут запускаться в момент выхода из текущей области видимости. Подробней можно прочитать в perldoc perlsyn:

use feature 'defer';
 
{
    say "This happens first";
    defer { say "This happens last"; }
 
    say "And this happens inbetween";
}

Экспериментальный блок finally для конструкций try/catch

try {
    attempt();
    print "Success\n";
}
catch ($e) {
    print "Failure\n";
}
finally {
    print "This happens regardless\n";
}

Поддержка не ASCII разделителей операторов-кавычек

Речь про qw, q, s// и т.п (подробнее в perldoc perlop). Список возможных разделителей доступен здесь.

Пустой sort теперь недопустим

@a = sort @empty; # всё хорошо
@a = sort;        # ошибка компиляции
@a = sort ();     # также ошибка компиляции

Некоторые использовали sort без параметра как странный способ создать пустой список.

Использование use VERSION со значениями меньше v5.11 признано нежелательным

При использовании версии до v5.11 будет выводиться предупреждение:

Downgrading a use VERSION declaration to below v5.11 is deprecated

Причиной данного нововведения является желание изменить поведение прагмы use VERSION. В версии 5.12 строгий режим включался только если он не был ранее явно выключен:

no strict;
use v5.12;  # "strict" не включится
$x = 1;     # всё хорошо

В будущем любое использование use VERSION со значением v5.12 и больше будет включать строгий режим.

Выпуск также включает улучшения производительности, документации и диагностических сообщений. С развёрнутым списком изменений можно ознакомиться в традиционной perldelta. Ссылка под новостью.

>>> Подробности

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 7)
Ответ на: комментарий от firkax

ну, скажем так, он очень сильно повлиял на них, даже теперь есть два их вида - регекспы нормальных людей и регекспы курильщиков перла

mumpster ★★★★★
()
Ответ на: комментарий от mumpster

гипотетически это вполне себе возможно, на шеле же писали ;-)

Я не о том. Когда начинается обсуждение языков и их достоинств, перлофанбои сразу выкатывают однострочники и регекспы на перле, как главнейшее его достоинство. Им говоришь про асинхронность в питоне, про безопасность памяти в расте, про корутины в го - а они тебе в ответ опять однострочники для обработки текста, будто других задач не существует.

пых-пых, при всех его недостатках - как раз сугубо утилитарен в разрезе не очень квалифицированного персонала

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

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от BydymTydym

Ну это или что-то подобное разве в каких-нибудь JAPH’ах и кодгольфе используется. Собственно с такими вещами разработчики и начали бороться. Про это написано. Обратная совместимость сохраняется если твой код написан разумным образом.

perl5_guy ★★★★★
() автор топика

Прагма signatures

Впервые появилась в версии 5.20.0, несколько раз изменялась и наконец перестала быть экспериментальной.

А ведь бывало и наоборот — впервые появилась, несколько раз менялась и наконец стала экспериментальной.

IPFreely ★★
()
Ответ на: комментарий от firkax

Perl появился раньше в 1987 плюс это был модный тогда C/bash style, а python был скорее enterprise style, отступы многие не могли простить. Imho (могу говорить только за себя) в конце 2000-х перешли из-за gevent, tornado ну и наверное django, хотя даже тогда было непростое время, болезненный переход python 2->3, некоторые даже говорили что это конец python.

x-term ★★
()
Ответ на: комментарий от tz4678_2

То, что оно должно так работать, не более чем твое мнение.

Aswed ★★★★★
()
Ответ на: комментарий от liksys

Падежи тут ни причём. Это разные по смыслу высказывания, ты перевёл неправильно.

Самое начало наездов: mysql_real_escape_string - это не выдумка пхпшников а название функции из официального mysql api.

И я не пхп-разработчик.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Падежи тут ни причём. Это разные по смыслу высказывания, ты перевёл неправильно.

Правильно, просто у тебя проблемы с восприятием написанного. э"PHP: Фрактал плохого дизайна". PHP с чем? С фракталом.

Самое начало наездов: mysql_real_escape_string - это не выдумка пхпшников а название функции из официального mysql api.

Ты даже не понял суть претензии. В официальном API кривая функция, и ее притащили напрямую в PHP as is, вместо того чтобы подумать головой и сделать качественную обертку.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от liksys

php простой как кирпич - там все обертки над сишными типами/функциями и даже биоовые флаги используются повсеместно в то время как в js передали бы объект options. кто и зачем должен был? свои обертки для базы только ленивый не писал

tz4678_2
()
Ответ на: комментарий от liksys

у пыхеров напрочь отбит вкус и критическое мышление по отношению к своему инструменту (очень часто от того, что они на нормальных языках не писали).

Я лично знаком только с одним «пыхером», но он писал на С, а потом уже метнулся в пхп, там денег давали в моменте, а потом уже и привык, да и денег стали ещё больше давать. Он, насколько я в курсе, даже в разработке пхп какое-то участие принимал. В общем, нормальный критический взгляд на инструмент, как и у любого другого адекватного профессионала.

Что там в этой пхп тусовке творится, никогда не сталкивался.

beck ★★★★
()
Ответ на: комментарий от liksys

Да нету там этого «с чем». Автор заявляет, что пхп - фрактал плохого дизайна. Фрактал это не дополнительная сущность, которая есть в пхп, это сам пхп. Это как ты хочешь сказать, что кто-то дурак, ты говоришь: {имя} - дурак. Ты не говоришь {имя} - с дураком.

Выражение «с фракталом» вообще звучит по-идиотски.

Ты даже не понял суть претензии. В официальном API кривая функция, и ее притащили напрямую в PHP as is, вместо того чтобы подумать головой и сделать качественную обертку.

Если претензия в этом, то всё ещё хуже. Официальное API, даже если оно неудачно названо, это намного лучше чем какая-то самодеятельность в этой области.

Я где-то видел удачную формулировку, что пхп - это клей, он склеивает друг с другом кучу разных библиотек. И в этом качестве он удачен. Не надо самодеятельности, есть библиотека, у неё есть функции, эти функции доступны для вызова из пхп, ну только типы данных конвертируются из нативных в пхп-типы.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от tz4678_2

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

liksys ★★★★
()
Ответ на: комментарий от firkax

Да нету там этого «с чем».

Есть. Фрактальность плохого дизайна - это свойство языка. Словоформа тут может быть любая.

Выражение «с фракталом» вообще звучит по-идиотски.

Это тебе так кажется просто. «Вселенная с ее масштабом нам непредставима». Допустимо «масштаб», «масштабность».

Официальное API, даже если оно неудачно названо, это намного лучше чем какая-то самодеятельность в этой области.

Чушь. Для клеевого языка нужно удобство выполнения рутинных операций, а не пердолинг с низкоуровневыми вызовами. В последнем ключе лучше сразу на си писать, не так криво всё будет.

И в этом качестве он удачен.

Нет. Как минимум из-за слабой типизации. Дальше - читай статью до просветления.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от liksys

Ну как можно так упёрто не понимать? Вот я тебе пишу: ты дурак. Не пишу «ты с дураком». Фраза «ты с дураком» могла бы означать что ты вдвоём с дураком, а тут другое. Могу написать «ты со своей дуростью» (дурость - свойство). Так вот, пхп - один. У него нет компаньона-фрактала, фрактал - это пхп и есть. Ну, по версии автора той статьи.

Вселенная с ее масштабом

Масштаб чей? Вселенной.

Фрактал чей? Дизайна.

Фрактал кто? Пхп.

Не знаю как ещё объяснить.

Для клеевого языка нужно удобство выполнения рутинных операций

Это сейчас в пхп есть свой драйвер mysql. Тогда же это была не фича языка, а интерфейс к библиотеке libmysqlclient. Один из множества интерфейсов к каким-то библиотекам. Те, кто знают библиотеку libmysqlclient, должны были без особых переделок уметь её использовать и в пхп. Повторю: это не «поддержка mysql для php», это «интерфейс к нативной библиотеке».

В последнем ключе лучше сразу на си писать, не так криво всё будет.

В си нет пхп-типов, на которые так ругается автор той статьи. Нестрогие пхп-типы и вообще нестрогость во всём (в т.ч. раньше имевшаяся возможность запустить скрипт с кучей синтаксических ошибок) - это фича пхп, ради которой его и использовали, а не недостаток. Если они не нужны, то да, лучше писать на си. Вне зависимости от того, какие библиотеки собираешься использовать.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Ну как можно так упёрто не понимать?

У меня к тебе тот же вопрос. Чел, прости, но я русский язык знаю явно получше тебя.

«Ты со своей дурью».

Не знаю как ещё объяснить.

Не надо объяснять, я понял, что ты веруешь в какую-то чушь.

это фича пхп

Вообще пушка.

Продолжай, впрочем, давно так не смеялся.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от tz4678_2

Ни то, ни другое не оправдывает протаскивание плохого API в высокоуровневый язык.

liksys ★★★★
()

Это все супер, только очень поздно. Лет 10-15 бы зашло, а сейчас perl скорее мертв, чем жив, увы. Хорошие идеи там точно есть.

ktan ★★★
()
Ответ на: комментарий от tz4678_2

А тут язык высокоуровневый в котором нет аргументов у функций

Тебе дали аргументы в полное распоряжение. Хочешь, — задавай жестко; хочешь — разбирай с применением логики любой сложности, хоть от фазы луны.

Так же и с ООП: вызывающий объект и родители у тебя в руках, вытворяй что хочешь.

level1 ★★
()
Последнее исправление: level1 (всего исправлений: 1)
Ответ на: комментарий от level1

не понимаешь простого: вот в редакторе, вызываешь автоподстановку и что дальше? Я не знаю какие вообще у функции аргументы!!! Те на перле не комильфо было писать уже в начале 90-х, он просто был заменой баша

tz4678_2
()
Ответ на: комментарий от tz4678_2

Я не знаю какие вообще у функции аргументы!!!

Попробуй начать писать документацию к коду, и жизнь заиграет свежими, яркими красками.

level1 ★★
()
Ответ на: комментарий от level1

ну перловики про такое, что функции должны иметь вменяемые названия как и их аргументы, чтобы мсразу было понятно, что те делают, те самодокументирующиеся и не слышали… и вот в перле просто нельзя (было раньше) так писать!!!!!!!!!!!!

tz4678_2
()
Ответ на: комментарий от tz4678_2

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

Это ты про себя, или к кому конкретно претензии?

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

level1 ★★
()
Последнее исправление: level1 (всего исправлений: 3)
Ответ на: комментарий от level1

И что много документации написали? Открываю я исходники условного mojolicious, а там одни shift, @, $[] и никаких тебе аналогов Javadoc/JSDoc, какие аргументы у методов/функций, что они возвращают - загадка от Жака Фреско.

Skadi
()
Ответ на: комментарий от Skadi

И что много документации написали?

Да, я много пишу доки для перла. Потом из нее генерю удобный вывод.

Конечно, далеко не все так делают. Но это не зависит от яп.

level1 ★★
()
Ответ на: комментарий от PolarFox

my $var = 'foo';

my...

он тоже не хочет считать локальную переменную глобальной.

OMG! А как ему ещё считать? Ты же её сам ЯВНО залокалил.

Attila ★★
()
Последнее исправление: Attila (всего исправлений: 1)
Ответ на: комментарий от level1

Конечно, далеко не все так делают. Но это не зависит от яп.

зависит

приличный язык тебя почти заставит написать аналогичное перловому sub foo( $a, $b, @c ) — а если не заставит (ты выкрутишься), то на первом же ревью тебе надают по рукам

a--
()

со скобочками, если я правильно понял ( https://metacpan.org/pod/feature#The-'extra_paired_delimiters'-feature ), все как обычно у Великого Лингвиста Ларри:

вот это:

f( qx🢥a🢤, 123, qx🢧b🢦 ) 

эквивалентно вовсе не вот этому:

f( qx(a), 123, qx(b) ) 

а вот этому:

f( qx(a🢤, 123, qx🢧b) ) 
a--
()
Ответ на: комментарий от level1

Отличная иллюстрация. Много тебе дадут эти a,b,c?

всяко больше, чем sub foo

а как насчет того, что для полного понимания сигнатуры foo может потребоваться попрыгать по коду десятка функций, так как foo свою @_ полностью не парсит, а отщипывает shift-ом штуки три элемента (причем не всегда, а по условию на $_[0]), а остальное передает на парсинг остальным функциям?

впрочем, всякие там питоны меня тоже приводят в ужас формулировками в документации вида «and email should be e-mail object»

e-mail object это что-то на тему «user@example.com» или на тему полного мессаджа с адресом, хедерами, и телом? или там можно любой из них поставить?

a--
()
Последнее исправление: a-- (всего исправлений: 6)
Ответ на: комментарий от level1

вообще, идея Practical Extraction and Report Language сама по себе здравая

но реализована она почти самым плохим из возможных способов

типы данных нужны даже для скрипта из 10 строк: у нас есть бинарные строки, уникодные строки, регекспы, потоки (файлы), айпишки, числа, дата, время, датавремя, пути к файлу, домены, xn--домены, e-mail, url, query_string, ...

у каждого из них свои понятия равенства, порядка (для сортировки), регекспы для чтения, форматы для записи

а еще в приличных языках можно легко и быстро разработать свой tainting и свои способы как его можно снимать, а как нельзя

tainting не решает вопроса «какие строки нужно html-эскейпить, а какие — нет»; а в приличном языке

print( $"<html><body>{foo}</body></html>" )
компилятор может посмотреть на тип foo и если надо, то эскейпить, а если не надо — то нет; таким образом работа программиста по указанию типа окупается отсутствием работы по указанию «надо-не-надо-эскейпить»

и обрати внимание, что все это — практические потребности, а не академический выпендреж на тему теории типов

a--
()
Последнее исправление: a-- (всего исправлений: 6)
Ответ на: комментарий от a--

Типы данных нужны конечно, особливо тем, у кого сообщение только с шестого раза получается написать :3

perl5_guy ★★★★★
() автор топика
Ответ на: комментарий от a--

а еще в приличных языках можно легко и быстро разработать свой tainting

Вам надо поучиться проектировать приложения, тогда такие вопросы отпадут сами собой.

level1 ★★
()
Ответ на: комментарий от firkax

Perl был шикарен в царстве ASCII. Но потом мир стал мультиязычным, а поддержку юникода они не осилили до сих пор (юникод есть лишь на уровне отдельных компонентов, но однобайтное прошлое торчит из всех щелей). Цирк с несовместимостью между версиями в угоду каким-то странным хотелкам. Обещания идеологов забросить 5-ю ветку, распотрошить CPAN и разговоры про perl6 лишили новичков стимула изучать актуальную версию. Плюс укоренившийся образ write -only кода.

Lucky ★★
()
Ответ на: комментарий от rupert

Ну и ещё в самой новости написано. Походу я один её читал. Когда писал :’(

perl5_guy ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.