После года разработки представлена (http://www.nntp.perl.org/group/perl.perl5.porters/2014/05/ms...) новая стабильная ветка языка программирования - Perl 5.18 (https://metacpan.org/release/RJBS/perl-5.20.0/). В рамках подготовки нового выпуска было изменено около 470 тыс. строк кода, изменения затронули 2900 файлов, в разработке приняли участие 124 разработчика.Ветка 5.20 выпущена в соответствии с утверждённым четыре года назад фиксированным графиком разработки, подразумевающим выпуск новых стабильных веток раз в год и корректирующих релизов - раз в три месяца. Примерно через месяц планируется выпустить первый корректирующий релиз Perl 5.20.1, в котором будут исправлены наиболее значительные ошибки, выявленные в процессе внедрения Perl 5.20.0. Одновременно с выходом Perl 5.20 прекращена поддержка ветки 5.16, для которой в будущем могут быть выпущены обновления только в случае выявления критических проблем с безопасностью. Также начался процесс разработки экспериментальной ветки 5.21, на базе которой в мае 2015 года будет сформирован стабильный релиз Perl 5.22.
Ключевые улучшения (http://search.cpan.org/~rjbs/perl-5.20.0/pod/perldelta.pod), добавленные в Perl 5.20:
- Экспериментальная поддержка сигнатур функций (http://search.cpan.org/~rjbs/perl-5.20.0/pod/perlsub.pod#Sig...), позволяющих явно определить перечень переменных, используемых в функции и автоматизировать операции проверки и присвоения значений из массива входящих параметров. Для активации поддержки сигнатур функций необходимо указать директиву "use feature 'signatures'"; Например, ранее используемый код:
<font color="#461b7e">
sub foo {
die "Too many arguments for subroutine" unless @_ <= 2;
die "Too few arguments for subroutine" unless @_ >= 2;
my($left, $right) = @_;
return $left + $right;
}
</font>
при использовании сигнатур может быть заменён на:<font color="#461b7e">
sub foo ($left, $right) {
return $left + $right;
}
</font>
При вызове foo с числом аргументов, отличным от двух, интерпретатор выведет ошибку. Синтаксис сигнатур также позволяет указывать необязательные аргументы и задавать значения, используемые по умолчанию в случае отсутствия аргумента. Например, указав "sub foo ($left, $right = 0)" второй аргумент становится необязательным. В операции присваивания можно указать произвольное выражения, в том числе с использованием других переменных из списка или глобальных переменных. Указание вместо переменной хэша или массива (например, "sub foo ($left, @right)") приведёт к возможности передачи одного и более аргументов.
В списке также поддерживается специальная переменная "$", которая позволяет игнорировать часть аргументов, например, "sub foo ($left, $, $right)" позволит выполнить копирование в переменные только первого и третьего аргумента, при этом в функцию необходимо передать ровно три аргумента. Возможность обращения к параметрам через массив "@_" сохраняется, поэтому второй аргумент можно получить как значение "$_[1]";- Для определения прототипов функций (http://search.cpan.org/~rjbs/perl-5.20.0/pod/perlsub.pod#Pro...), предоставляющих средства для проверки аргументов на этапе компиляции, а не в процессе выполнения, обеспечена поддержка атрибута ":prototype", например, теперь можно указать "sub foo :prototype($$);" вместо "sub foo ($$);". "$$" подразумевает вызов с двумя аргументами. Для определения типа аргумента могут использоваться такие символы, как "$" (переменная), "@" (массив), "+" (ссылка на массив или хэш), "*" (файловый десктиптор). Для отделения обязательных аргументов от опциональных используется знак ";". Для прототипов функций допускается указание сигнатур, например, "sub foo :prototype($$) ($left, $right)";
- Функция rand() переведена на использование для всех платформ более качественного последовательного генератора псевдослучайных чисел drand48(). Ранее для 48-битовый генератор псевдослучайных чисел использовался только для POSIX-систем, таких как Linux, а в Windows применялась менее безопасная 15-битная реализация;
- Новый синтаксис для операции разделения хэшей и массивов (slice (http://search.cpan.org/~rjbs/perl-5.20.0/pod/perldata.pod#Ke...)) - %hash{...} и %array[...], при использовании которого возвращается список из пар ключ/значение или номер/значение;- Добавлена экспериментальная операция постфиксного разыменования (postderef). Например, операция "$sref->$*" эквивалентна "${ $sref }", "$aref->@*" аналогична "@{ $aref }", а "$href->%{ ... }" можно использовать вместо "%$href{ ... }". Для активации поддержки необходимо указать директиву "use feature 'postderef_qq'";
- Поддержка Unicode 6.3 (http://www.unicode.org/versions/Unicode6.3.0). Для регулярных выражений добавлена поддержка маски "\p{Unicode}", которая является синонимом "\p{Any}" и срабатывает для кодов символов в диапазоне 0 - 0x10FFFF.- Директива "use locale" теперь может применяться с локалями UTF-8 (ранее поддерживались только однобайтные локали). Добавлена опция "-DL" для отслеживания настроек локали в процессе запуска интерпретатора;- Улучшена работа на 64-разрядных платформах. Внутренние функции работы с массивами переведены на использование 64-разрядных смещений, что позволяет создавать массивы, содержащие более 2^31 элементов. Движок регулярных выражений теперь может работать со строками длиннее
2^31 символов. Функции PerlIO_get_bufsiz, PerlIO_get_cnt, PerlIO_set_cnt и PerlIO_set_ptrcnt переведены с типа int на тип SSize_t;URL: http://perlnews.org/2014/05/perl-5-20-released/
Новость: http://www.opennet.me/opennews/art.shtml?num=39865
> Экспериментальная поддержка сигнатур функцийШел 2014-й год.
Perl застраял в 20 веке
Молодой человек, вы ничего не понимаете! Это же — классика!
Я тоже не пойму зачем портить классику. Придумали же вон, LLVM, любой школьнег теперь может любой язык себе замастырить.
Ты его просто не с той стороны применял, вот он и "застраял"
>Директива "use locale" теперь может применяться с локалями UTF-8 (ранее поддерживались только однобайтные локали)Это круче в 2014-м
Не знаете, наверное, о чём говорите. Эта use locale на практике не используется обычно. И её поддержка к поддержке unicode и всего хорошего, что с ним связано, не имеет отношения. Так же почитайте внимательно что именно с ней сделали https://metacpan.org/pod/distribution/perl/pod/perldelta.pod... (если perl знаете)
И наконец-то сжалились над товарищами с квадратно-гнездовым мышлением, приходящими с других ЯП, и запилили для них костыль. Осталось добавить в ядро какую-нибудь надстройку над ООП вроде moo, а то дефолтное ООП беднягам тоже мозг выносит.
В общем-то да, это ведь всего-то лишь синтаксический сахар. К тому же, парсинг параметров при помощи @_ на мой взгляд есть штука куда более гибкая, чем может то предложить сигнатурная модель объявления функции.
И более запутанная. Пример наглядно показывает как 4 строчки вырождаются в 1 (понятно что в откомпиленном те же 4 строчки и остались). На мой взгляд сигнатурный способ позволяет уже на этапе написания избежать кучи ошибок. Но заметьте, никто старый способ не выпилил, поэтому дело вкуса и необходимости. Хочется писать по-старому / нужно парсить переменное количество аргументов - пишите, никто вам не запрещает
> И более запутанная. Пример наглядно показывает как 4 строчки вырождаются в 1
> (понятно что в откомпиленном те же 4 строчки и остались). На
> мой взгляд сигнатурный способ позволяет уже на этапе написания избежать кучи
> ошибок. Но заметьте, никто старый способ не выпилил, поэтому дело вкуса
> и необходимости. Хочется писать по-старому / нужно парсить переменное количество аргументов
> - пишите, никто вам не запрещаетВсё равно новая версия перла станет актуальной только через несколько лет - когда до дистрибутивов дойдёт, так что вопрос академический. Да и надо как-то решить вопрос с объявлением параметров с помощью старого Function::Parameters, MooseX::Declare и н ового метода и понять на практике что будет при смешивании этих стилей, что будет видно в отладчиках и профайлерах, что будет делать с тавими функциями EPIC в Eclipse, как будет форматировать perltidy, и куча вопросов которые сходу не приходят в голову. Вообще нововведение выглядит очень хорошим, странно что так долго его вводили.
Не хватает Best Practice как руководства по новым возможностям перла, что рекомендуется использовать, что нет.
>> И более запутанная. Пример наглядно показывает как 4 строчки вырождаются в 1
>> (понятно что в откомпиленном те же 4 строчки и остались). На
>> мой взгляд сигнатурный способ позволяет уже на этапе написания избежать кучи
>> ошибок. Но заметьте, никто старый способ не выпилил, поэтому дело вкуса
>> и необходимости. Хочется писать по-старому / нужно парсить переменное количество аргументов
>> - пишите, никто вам не запрещает
> Всё равно новая версия перла станет актуальной только через несколько лет -
> когда до дистрибутивов дойдёт, так что вопрос академический.Думаю, будет уже в OpenBSD 5.6 (ноябрь 2014) или 5.7 (май 2015). Эта ОС едва ли не больше прочих полагается на Perl; в первую очередь — в подсистеме управлении пакетами.
Вообще-то пример из статьи плохой, т.к. используй прототипы уже 100 лет, как можно написать так:
sub foo($$)
{
my($left, $right) = @_;
return $left + $right;
}А если экономить на кол-ве строчек, так вообще можно так:
sub foo($$){shift+shift}
> Вообще-то пример из статьи плохой, т.к. используй прототипы уже 100 лет, как
> можно написать так:
> sub foo($$)
> {
> my($left, $right) = @_;
> return $left + $right;
> }
> А если экономить на кол-ве строчек, так вообще можно так:
> sub foo($$){shift+shift}Прототипы были придуманы для другого: не для экономии или удобства, а для возможности создания функциональных аналогов встроенным функциям Perl вроде push().
На самом деле старый способ не выпилили, т.к. парсер не может выявить использование @_ в подпрограммах на этапе компиляции, т.к. некоторые части программы могут определяться только на этапе исполнения. Например, при выполнении eval кода, содержащегося в строке:sub foo {
eval 'say for @_';
}Dave Mitchell также привёл пример с выполнением кода в регулярных выражениях:
$pat = qr/(?{ print "[$_]\n" for @_ })/;
sub f($str, $pat) { $str =~ $pat }Поэтому пока переменная @_ по-прежнему доступна в функциях с сигнатурой.
См. http://pragmaticperl.com/issues/13/pragmaticperl-13-сигнатура-функции-в-perl-5.20.html#issue-переменная-_
Вам охота в каждой функции вручную проверять количество аргументов, присваивать значения по умолчанию и т. д.? Вам заняться больше нечем? Кроме того, при наличии явной сигнатуры можно проверять правильность вызова функций на этапе трансляции, а не отлавливать ошибки в редко используемых кусках кода во время исполнения.
>Кроме того, при наличии явной сигнатуры можно проверять правильность вызова функций на этапе трансляции, а не отлавливать ошибки в редко используемых кусках кода во время исполнения.Разочарую вас, но кроме сигнатур в Perl ещё есть прототипы функций. С их помощью можно проверять правильность вызова функций на этапе трансляции. Более того, я всегда ими пользуюсь и отлавливаю такие ошибки.
Не помню почему, но perlcritic на них ругается.
В доке их тоже рекомендуют не использовать и даже объясняют причины. В первую очередь из-за того, что многие их используют не по назначению, а для этой самой дурацкой проверки количества аргументов.
> В доке их тоже рекомендуют не использовать и даже объясняют причины. В
> первую очередь из-за того, что многие их используют не по назначению,
> а для этой самой дурацкой проверки количества аргументов.Почему же дурацкой? Как perlcritic аргументирует свою неприязнь к такой проверке?
И не только количество проверяется, но и тип - скаляр, массив или хэш. Массив или хэш, правда, можно указать только один и только в конце, но и то хорошо. Кроме того, можно отделить точкой с запятой необязательные аргументы. Вполне себе полезный функционал, за неимением лучшего.
>вручную проверять количество аргументовНе занимаюсь подобными глупостями.
>присваивать значения по умолчанию
Очень редко нужно
>при наличии явной сигнатуры можно проверять правильность вызова функций на этапе трансляции
И получить ложную уверенность в ее правильности. Спасибо, мне не нужно. Перепутать порядок следования аргументов куда легче, чем забыть их количество.
Единственное, что мне слегка надоедает писать, это строки типа
my $self=shift;
Я даже знаю несколько способов как этого избежать, но применять их мне еще более лениво :)
>Шел 2014-й год.это синтаксический сахар для новичков.
зря добавили - старый путь он приводил к пониманию, как в перле работают функции, чего там происходит и т.п., а теперь это понимание прячут, что не есть гуд.все нововведения окромя возможно copy-on-write со строками в 20 версии имно ниочем.
А когда же Perl 6 !?
Когда Perl 6.
Это что же, не раньше, чем Perl 6?
Скорее всего так и останется чисто исследовательским проектом без практической реализации.
В современном мире программное обеспечение становится достаточно большим и сложным, поэтому старые традиции программописательства стали неприменимы. Если раньше каждый второй анонс выхода новой версии софта начинался словами "Полностью переписана реализация ..." и при этом утаивалась причина (NIH-синдром кого-то из программистов). То сейчас уже многим стало понятно, что в современном мире такой подход неприемлем - рулит эволюционный подход. Части программных комплексов переписываются, но не внезапно, а дозировано, контролируемо, небольшими порциями, чтобы не только иметь гарантию, что в любой момент продукт работает, но и четко представлять насколько надежно он работает.Локомотивом и самым ярким представителем в этом движении является ядро Linux - фаворит и оплот свободного ПО. Хотя, конечно, не они первые осознали необходимость данного подхода, но они своевременно осознали его необходимость и востребованность (а ведь даже сейчас еще многие не до конца осознают это). В результате такого нового подхода к разработке, отвечающего современным требованиям к скорости развития и сохранения стабильности ПО, уже нет необходимости в смене первой циферки версии (например, в PHP 5.4 эволюционно реализовали все, что планировали сделать в php6, в первую очередь - поддержку Unicode, но циферку не стали менять). Хотя, чисто по привычке ее иногда меняют (Linux 3.x.x), но четко осознают, что такое изменение чисто косметическое и не отражает внутренних изменений в продукте.
Так что теперь настала новая эпоха - эволюционных изменений ПО. Долой революции и переписывания с нуля - этот подход не работает в сколько-нибудь сложном программном комплексе. Революционные изменения (смена языка, архитектуры, фреймворка), хоть и создают иллюзию стремительного изменения, но не дают гарантии получения лучшего результата. Однако при эволюционном изменении тоже не нужно вдаваться в крайности. Перенос кнопок справа налево, смена обоев и, тем более, безвозвратное удаление элементов управления во благо "упрощения" интерфейса не являются признаками развития программного продукта (видимость какого-то изменения возникает, но всегда ли такие изменения полезны?).
Да здравствуют эволюционные изменения, которые гарантируют постепенное, но неудержимое движение к светлому будущему!
Ура, Товарищи!!!
Запор прямой кишки лечится, не надо так мучиться как ты тут :)
> А когда же Perl 6 !?# tail /usr/portage/dev-lang/rakudo/ChangeLog
[...]
*rakudo-2009.12 (08 Jan 2010)
08 Jan 2010; Patrick Lauer <patrick@gentoo.org> +rakudo-2009.12.ebuild4 года уже какбы
Вот только для практического применения rakudo, как впрочем и остальные реализации, не годится - тормозит просто дичайше. Они с самого начала оправдывались, что сначала сделаем все фичи, а уже потом оптимизации. То, что скорость надо будет поднять минимум на три порядка их не смущало. Последние пару лет оптимизируют. У них даже получилось ускорится на порядок, звучит круто, но только пока не вспоминаешь, что perl5 все еще на два порядка быстрее. Так что в для практиков perl6 скорее всего так и не появится.
> Вот только для практического применения rakudo, как впрочем и остальные реализации, не
> годится - тормозит просто дичайше.И чего? Жабка тоже тормозит по сравнению с нативом, а используют.
> два порядка быстрее. Так что в для практиков perl6 скорее всего так и не появится.
Тут дело имхо не в скокрости, а в том что народу хватает того что есть. Когда не хватает на скорость плюют.
Вот на руби жалуются что тормозит, а я например (на локальном core-i7 для своих задач) этого не очущаю
Где вы такое увидели?
На сайте rakudo.org:Announce: Rakudo Star Release 2014.04
This is the first Rakudo Star release with support for the MoarVM backend (all module tests pass on supported platforms) along with experimental support for the JVM backend (some module tests fail).
Т.е. они задеплоиили поддержку в качестве бэкэнда MoarVM и экспериментальную поддержку JVM. По-моему неплохо
>The use of interpreter-based threads in perl is officially discouraged.
Да ладно, вам, зубоскалы!Сигнатуры *давно* существовали, просто в качестве необязательных модулей, к-е можно было прикрутить к перлу. Например, https://metacpan.org/pod/Function::Parameters . Кому надо - использовал, кому не надо - не использовал.
Сейчас это в ядре перла сделали очень аккуратно, чтобы не поломать обратную совместимость, т.е. чтобы код 25-летней давности продолжал работать на современной версии интерпретатора.
> Сейчас это в ядре перла сделали очень аккуратно, чтобы не поломать обратную
> совместимость, т.е. чтобы код 25-летней давности продолжал работать на современной версии интерпретатора.бидонистам этого не понять, для них это ересь
>бидонистам этого не понять, для них это ересьOrly? а ЧЕГО ЖЕ ТОГДА :
>>прекращена поддержка ветки 5.16дЖва года прошло - и снова всё переписывай?
>прекращена поддержка ветки 5.16Это означает что не будет 5.16.4, 5.16.5 и так далее.
>>прекращена поддержка ветки 5.16
> Это означает что не будет 5.16.4, 5.16.5 и так далее.Ну я и говорю - как и в питоне, уже нет 1.*, 2.[123].* ...
версий нет, но код то есть. И этот код сам не перепишется под новые версии питона 3.*, 4.*, 5.*, а в перле и переписывать не надо, всё и так работает.
> версий нет, но код то есть. И этот код сам не перепишется
> под новые версии питона 3.*, 4.*, 5.*, а в перле и_как_и_в_перле_ :)
> переписывать не надо, всё и так работает.И не надо звиздеть что оно само. А если "с лёгким напильником" - дык и у змеев есть 2->3 конвертер и тоже почти работающий :)))
Ты не уловил снова. Идет развитие ветки 5.xx - это значит код в версии 5.xx работает в версии 5.yy, где xx <= yy.
> Ну я и говорю - как и в питоне, уже нет 1.*,
> 2.[123].* ...Когда вы говорите, такое впечатление что вы бредите (с)
dev-lang/python
Available versions:
(2.6) [M]2.6.8-r3 [M]~2.6.9
(2.7) 2.7.5-r3 ~2.7.5-r4 2.7.6 ~2.7.6-r1
(3.2) 3.2.5-r3 ~3.2.5-r4
(3.3) 3.3.2-r2 3.3.3 ~3.3.4 ~3.3.5
(3.4) ~3.4.0_rc1 ~3.4.0_rc3 ~3.4.0[I] dev-lang/perl [...] 5.16.3(0/5.16)
Мухаха :) Выучи регекспы перловка ! :)
Еще как понять. Ты же не думаешь, что на python3 только из-за тормозов никто не переходит?
Поздравляю перловщиков!
Хоть сам уже юзаю редко, но приятно что не бросили :)
Я так понял что модули CGI::* уходят в собственный цикл разработки и останутся?
Или замена на нечто другое?
> Я так понял что модули CGI::* уходят в собственный цикл разработки и
> останутся?
> Или замена на нечто другое?Да просто сама модель web-сервисов как CGI скриптов уходит из моды, Mojolicious отлично маскирует всю CGI обработку, да и писать на нём проще чем создавать кучу CGI. Я уже и забыл когда нужен был CGI.pm .
Catalyst ещё круче
> Catalyst ещё кручеПринципиального значения не имеет, В любом случае CGI нечасто сейчас используется.
Кстати, насчёт "круче" - а где об этом почитать можно? Сравнение. Пока я знаю только то, что Catalist включает Moose и DBIC - что с моей точки зрения минус, а не плюс.
> Кстати, насчёт "круче" - а где об этом почитать можно? Сравнение. ПокаНу, %D почитай modernperlbooks.com/mt/2014/01/the-limits-of-a-programming-language-vision.html
> я знаю только то, что Catalist включает Moose и DBIC -
>> Кстати, насчёт "круче" - а где об этом почитать можно? Сравнение. Пока
> Ну, %D почитай modernperlbooks.com/mt/2014/01/the-limits-of-a-programming-language-vision.htmlТам разве про Catalist vs Mojolicious ?
> Там разве про Catalist vs Mojolicious ?Там про то, то реагировать на "Catalyst ещё круче" вопросом "где об этом почитать" в новости про релиз перла неправильно. Или я опять тэги пропустил.
>> Там разве про Catalist vs Mojolicious ?
> Там про то, то реагировать на "Catalyst ещё круче" вопросом "где об
> этом почитать" в новости про релиз перла неправильно. Или я опять
> тэги пропустил.Если встретился человек, знающий что Catalist круче Mojo, грех не спросить :)
Т.е. threads deprecated, но взамен пока ничего достойного нет?
Давно уже есть Coro
POE, Coro, AnyEvent, и еще пара десятков модулей.
show me queues at "POE, Coro, AnyEvent, и еще пара десятков модулей." plz
Coro::Channel, у POE и AnyEvent вообще другая модель, если нужна именно многопоточность, то есть forks - эмулирующий все апи threads на нормальных форках, т.к. threads это эмуляция форков для венды.
Там же написано, пока не deprecated.
Байки из склепа.
дурачёк.
Эх, стоило не пописать на Перле лет 10, как уже совсем другие вещи! Coro, Catalist, сигнатуры... Надо освежить память и написать очередной многопоточный веб-сервер.
>очередной многопоточный веб-серверMojo::Server::Hypnotoad
Стоит ли переходить с Perl 5.18 на 5.20?