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)

На FreeBSD 13.1 изменить в /etc/make.conf:

DEFAULT_VERSIONS+=perl5=5.36

Поставить новый perl и обновить зависимости.

Вот результат:

> pkg info -dr perl5
perl5-5.36.0
Required by    :
	llvm14-14.0.4
	llvm13-13.0.1_2
	mousepad-0.5.9_1
	mysql57-client-5.7.38
	groff-1.22.4_4
	texinfo-6.8_3,1
	glibmm-2.66.2,1
	zenity-3.32.0
	colordiff-1.0.20
	mythes-1.2.4_7
	hunspell-1.7.0_2
	hyphen-2.8.8
	libwpg03-0.3.3_1
	icon-naming-utils-0.8.90_1
	thunar-4.16.11
	xfce4-panel-4.16.4
	libexo-4.16.3
	libxfce4util-4.16.0
	mate-terminal-1.26.0
	xscreensaver-6.02_1
	netpbm-10.91.01_1
	intltool-0.51.0_1
	p5-Locale-libintl-1.32
	p5-Text-Unidecode-1.30
	p5-Unicode-EastAsianWidth-12.0
	p5-XML-Simple-2.25
	p5-XML-SAX-Expat-0.51_1
	p5-XML-SAX-1.02
	p5-XML-SAX-Base-1.09
	p5-XML-NamespaceSupport-1.12
	p5-XML-Parser-2.44
	p5-libwww-6.66
	p5-WWW-RobotRules-6.02_1
	p5-HTTP-Negotiate-6.01_1
	p5-HTTP-Cookies-6.10
	p5-HTML-Parser-3.78
	p5-HTTP-Message-6.36
	p5-LWP-MediaTypes-6.04
	p5-IO-HTML-1.004
	p5-Clone-0.45
	p5-HTML-Tagset-3.20_1
	p5-File-Listing-6.15
	p5-HTTP-Date-6.05
	p5-TimeDate-2.33,1
	p5-Authen-NTLM-1.09_1
	p5-Digest-HMAC-1.04
	p5-Net-HTTP-6.22
	p5-IO-Socket-SSL-2.074
	p5-Mozilla-CA-20211001
	p5-Net-SSLeay-1.92
	p5-URI-5.10
	p5-Try-Tiny-0.31
	p5-Encode-Locale-1.05
iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 1)

ну молодцы, чо. наконец начали не стесняться тащить фичи из пайфона, может, пёрдл на ЯП начнет походить

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

Шестого нету больше. Оно в рак превратилось (Raku). Два года назад планировали закончить пятый перл с 5.32 и дальше называться perl 7. В итоге не взлетело. По разным причинам, но основная, на мой вгляд, из-за того, что у огромное количества людей с голосом в перл сообществе - легаси говоного мозга. Этот самый легаси, которые убил язык 20 лет назад.

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

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

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

Я бы сформулировал иначе. Перл сам по себе легаси, самая главная его ценность в том, что им можно запускать 10-20 лет назад кем-то написанные скрипты. Поэтому кардинально новые его версии, лишенные этой основной фичи, не нужны и никогда не будут нужны.

которые убил язык 20 лет назад.

Мне кажется у него не было шансов изначально. Как только появился более-менее приемлемо выглядящий скриптовый язык (пхп с си синтаксисом) - 90% скриптователей переехало в него, а потом когда появился питон (не с си синтаксисом но тоже приятнее) - в него переехали 90% из тех, кто не переехал в пхп раньше.

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

Моя интерпритация происходящего просто критичнее и жестче, но с любовью, конечно ;)

paran0id ★★★★★
()

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

var = 42
def foo():
  var = 'foo'
foo()
print(var)
tz4678_2
()
Ответ на: комментарий от mydibyje

то что из-за изначального неправильного проектирования языка теперь проблематично заставить код правильно работать (var в идеале должно быть = foo) без костыля в виде global… я уже молчу и про всякие Foo__variable и тп. нет ни одного идеального языка из мне известных, а вот perl - лидер после баша в рейтинге самых странных языков

tz4678_2
()
Ответ на: комментарий от tz4678_2
my $var = 42;
sub foo {
    my $var = 'foo';
}
foo();
print "$var\n";

Ваш perl тоже какой-то неправильный, он тоже не хочет считать локальную переменную глобальной.

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

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

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

кому и зачем оно надо? в питоне просто не хотели вводить какие-то var и local для обозначения локальных переменных… ясное дело, что нужно классы объявлять для такого, но почему бы и не сделать как у всех

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

с этим примером все хорошо. это называется область видимости. в данном случае var внутри функции является shadowing variable. если не знаешь python, то не только global может показаться костылем. т.е. тут вопрос не к питону, а к программисту, не желающему почитать документацию, но уже считающему, что имеет право на суждение о правильности/неправильности конструкций в языке :)

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

Может хотят назвать нормально, вместо наркомании given / when.

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

если бы ты знал больше пары-тройки языков, то то же бы считал php, python каличными, но тебе ко-ко-конечно виднее знаю там я что-то или нет

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

если бы ты знал больше пары-тройки языков

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

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

Да тут кому-то подобное поведение в питоне не понравилось.

PolarFox ★★★★★
()

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

Учитывая то, что это классический язык, с существующими скриптами и своей нишей, и то что рег-экспы вышли из него, я думаю, это хорошая новость. А учитывая обратную совместимость, так вообще всё прекрасно

Нэхай будЭ :-)

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

из-за изначального неправильного проектирования языка теперь проблематично заставить код правильно работать (var в идеале должно быть = foo) без костыля в виде global…

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

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

seo, golang

мания величия и недоязык, который выучить пару недель

php, drupal

ок

антипаттерн

php

антипаттерн

бесконечная рекурсия и так до перезагрузки…

в похапе когда я на нем писал религия global не позволяла использовать, а потом запилили use, который делал то же самое…

я вел о другом речь… но каждый понял это по-своему

отправляетесь оба в мой санкционный список

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

Не можешь атаковать мысль, атакуй мыслителя!

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

порриджи уже и не знают кто такой котеров… пхп был не плох, пока джавобои его у java 2.0 не превратили, но по-ходу, люди покусанные мартиным, убивают один язык за другим, превращая его в джаву. интересно, когда perl превратится в нее… try/catch/finally уже завезли…

tz4678_2
()

Ледниковый период всё ближе?

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

Если труп шевелится, то надежда на оживление ещё есть …

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

А где по-другому работает?

локальные переменные на то и локальные.

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

правильно. там недостатки не смертельные. а во вложенных тернарных операторах просто не надо было скобки экономить. да и таких примеров с wtf %language_name% можно за 5 минут сотни нагуглить. и то я читал все это в свое время.

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

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

liksys ★★★★
()

Perl был хорош из-за своего уникального синтаксиса, из-за близости к bash, из-за удобства быть «всегда под рукой», и из-за больших библиотек готового кода типа CPAN. Когда Perl стали «догонять» до уровня PHP/Python - все пошло через Ж. Я считаю, что просто выбрали не ту нишу. Lua - тоже скриптовый язык, но свою нишу занял. Надо было и Perl развивать в сторону emberded или занимать место gnu-parallels или что-нибудь еще такое полусистемное. На худой конец могли CPAN превратить в какой-нибудь стандартный репозиторий языка, укрупняя и встраивая в Perl самые важные библиотеки. Но решили стрелять во все стороны сразу, попутно коверкая язык - и промахнулись. А преданные пользователи как-то не выдержали и разбежались.

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

Ну для любителей Perl есть более вменяемая альтернатива Ruby. Нужно было как-то понять, что и на баше уже писать - мука… А тут язык высокоуровневый в котором нет аргументов у функций… Ну поздно это осознали… Все кто не хотел с голоду умереть уже на PHP/Ruby убежали. Python такой же древний как Perl. Никто же не мешал перенимать фичи. Вон пхпшники взяли же все из Java утащили

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

90% скриптователей переехало в него

100500 скриптователей переехал с него на пых-пых не потому что он приемлемо выглядел, а тупо потмоу что было просто писать амнокод прямо в тексте html странички, не меняя структуры сайта, написанной амнодизайнером и не встраивая амно-cgi.

а потом когда появился питон

тащемта питон появился раньше чем пых-пых (1991 vs. 1995)

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

тащемта питон появился раньше чем пых-пых (1991 vs. 1995)

Удивительно, я и не знал. Ну значит переезд случался не с появлением а позже из-за каких-то обстоятельств, показывавших язык массам.

прямо в тексте html странички, не меняя структуры сайта,

Наверно это тоже важный фактор был. Но всё-таки пхп намного проще чем перл освоить даже если так не делать, а писать целиком код с echo для вывода html.

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

OMG! какой там взыскательный эстет!

схоронил к себе в копилку зануд

сопсна, ваш собеседник всё правильно написал

поэтому туда все хомячки с cgi-перла и ломанулись

и я вам скажу, как человек, отвечавший за отсутствие Y2K на наших 100500 сайтах, справиться с охулиардом php сайтов на счёт того было на порядок попроще чем с всего-то несколькими перл-сайтами. и всё равно 01.01.2000 вылез «перл» на перл-сайте «1 января 20100 года» ;-)

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

сопсна, коллега ликсыс дал ссыль на статью пых-пых ненавистника, но там всё правильно написано ))))) изначально пых=пых и был ориентирован на неопытных нубов чобы быстренько наамнокодить сайтец

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

Я б не сказал, что я эстет, я скорее за утилитарность. А в истории с PHP vs. Perl я придерживаюсь теоремы Эскобара. Первое - поделие недоучек, второе - сферический легаси с поехавшим синтаксисом в вакууме, порождающий тонны говнокода в виде белочек.

PS: Тому, кто предложит однострочник на перле с крутым регекспом, и спросит, может ли ваш питон/го/раст/чертлысый это повторить, я предложу написать на регекспах веб-сервер. Для осознания, что мир регекспами на ограничен.

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

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

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

Во-первых, ты немного переврал название статьи. Не «с фракталом» а «фрактал». Во-вторых, у пхп есть неприятные недостатки, да, но по ссылке очень много наездов мимо.

firkax ★★★★★
()

@a = sort;

О, боже, но смысл? Вот подобные (не конкретно этот, который безобиден) выверты люди перл и недолюбливают. Иной раз, когда на драйве, понапишешь нечто, полное идиом… а потом повеситься охота, глядя на код через год-два.

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

И? От этого у перла стал менее поехавший синтаксис?

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

Во-первых, в русском языке есть такая штука, которая называется «падежи».

Во-вторых, все наезды по ссылке не высосаны из пальца, а основаны на вещах из пхп, существующих сейчас и/или существоваших в нем ранее.

Я заметил, что пхп-разработчики - единственные, кто безоговорочно хвалит свое болото, и такие каждый раз: «ну говно, конечно, но не так уж и воняет, если привыкнуть». Я могу постоянно ругать сишку и питон, на которых в основном пишу, потому что многие вещи меня в них вымораживают. Но у пыхеров напрочь отбит вкус и критическое мышление по отношению к своему инструменту (очень часто от того, что они на нормальных языках не писали).

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

придерживаюсь теоремы Эскобара

согласен

предложу написать на регекспах веб-сервер

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

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

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