LINUX.ORG.RU

Perl 5.20

 ,


3

8

Несколько часов назад состоялся релиз новой мажорной версии языка программирования Perl. Разработка Perl 5.20.0 заняла примерно 12 месяцев с момента выпуска Perl 5.18.0 и содержит около 470 000 строк изменений в 2 900 файлах от 124 авторов.

В этой версии достаточно много новшеств:

  • Subroutine signatures
    То, чего многие так ждали, а другие возражали привычным «ненужно»
    sub foo($bar, $baz) {
      print "\$bar=$bar, \$baz=$baz"
    }
    
    Таким образом теперь можно определять параметры функции в скобках после её имени. Есть и возможность задать значение по умолчанию
    sub bar($foo, $baz=10) {
      print '$foo+$baz=', $foo+$baz
    }
    
    О других особенностях новой экспериментальной возможности можно прочитать в perldoc perlsub. Стоит отметить, что старый механизм получения параметров функции из @_ также остаётся в силе.
  • Новый синтаксис для получения среза ключей-значений/индексов-значений для хешей/массивов
    %hash{...} и %array[...] соответственно
    %h = (blonk => 2, foo => 3, squink => 5, bar => 8);
    %subset = %h{'foo', 'bar'}; # срез ключ-значения для хеша
    # %subset теперь (foo => 3, bar => 8)
    
    @a = "a".."z";
    @list = %a[3,4,6]; # срез индекс-значения для массива
    # @list теперь (3, "d", 4, "e", 6, "g")
    
  • Постфиксное разыменовывание
    К старому доброму разыменовыванию ссылок, навроде @$foo и %$bar, был добавлен вариант постфиксного разыменовывания: $foo->@* и $bar->%* соответственно. Синтаксис для других типов ссылок можно посмотреть в perldoc perlref
  • Механизм копирования при записи (copy-on-write) для строк
    Теперь при присвоении переменной значения другой строковой переменной не создаётся копии буфера вплоть до тех пор, пока значение одной из переменных не будет изменено. Это увеличивает скорость присвоения и снижает потребление памяти. Теперь не потребуется передавать в функцию строковую переменную по ссылке, чтобы увеличить производительность.

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

★★★

Проверено: Aceler ()
Последнее исправление: cetjs2 (всего исправлений: 2)

Ответ на: комментарий от Divius

Открыл новость про Perl

теперь можно определять параметры функции в скобках после её имени

Закрыл новость про Perl

ну, мнение выразить не удержался.

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

Хм. а действительно. Только что проверил и понял что располагал устаревшими данными. Раньше (лет пять назад) было нельзя, интерпретатор выдавал ошибку индентации при использовании табов. Извиняюсь.

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

сервисный процесс (daemon) на perl - явление органичное, чего врядли скажешь про python или ruby - они же реально тормозят! Уж лучше тогда запилить на bash - и ломаться все равно будет реже, наверное, после выхода новых версий всех задействованных в сценарии утилит.

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

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

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

python или ruby - они же реально тормозят!

Что тормозит? Я просто не фанат ни того, ни другого, деталей особо не знаю. Народ все же пишет и пишет неплохие вещи. Т.е. язык делает свое дело. Если заботит вопрос производительности и тормозов, то ни перл, ни питон, ни руби тут не помогут. Только си/си++, только хардкор. В перле полно тормозов из-за того, что в нем куча оберток на каждый случай жизни:

my $value = 123;

if ($value eq "strings, please") {
  ...
}
Вот такой простой код покажет под gdb, что творится внутри перла. И сколько там всяких чудес происходит. И звери бродят, и русалки на ветвях... :)

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

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

Пишу и на PHP, и на Ruby, и на Python

Понятно, все эти языки неполноценны, иначе зачем писать на трёх разных скриптовых языках одновременно

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

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

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

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

Дважды сталкивался с текучими демонами на ruby. Один из них популярный опенсорсный chef-client, который разжирался до десятков гигабайт. Вряд ли это проблема языка, но осадочек остался.

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

Согласен, это ж теоретик. блаблабла кнут блаблабла системы блаблабла тьюринг блаблабла настоящий программист блаблабла .........

Не надо лишний раз показывать свой уровень суждения. Мы уже знаем кто ты и что можешь.

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

Дважды сталкивался с текучими демонами на ruby.

Текучие демоны, опенсорс не бось? Когда тебе платят и платят хорошо, то тут все на совести. В перле мне приходится ковыряться в чужих модулях. Мой код не совершенен, как и их. Приходилось патчить все самому. Были утечки, и у меня и у других авторов. Были баги, и у меня и у них. Разное было. Со временем я стал меньше делать своих ошибок и больше исправлял чужие. Нет, я не стал идеальным, но и не жалуюсь.

Один из них популярный опенсорсный chef-client, который разжирался до десятков гигабайт.

Хм. Ну и им платят за устранение ошибок (по идее). Так что, через н-дней уверен все починили. А если не починили, то это, опять же, на их совести. Причем тут ЯП? :)

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

через н-дней уверен все починили

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

Причем тут ЯП?

Не вникал в суть утечек, но возможно, например, вышеупомянутые циклические ссылки

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

Во-первых, это быстрее. Положить на стэк три переменные куда быстрее, чем создать хэш, заполнить его, положить указатель на него на стэк, выполнить функцию и сделать GC для хэша и его содержимого. Во-вторых, меньше кода — не нужно лишнее объявление хэша. В-третьих, код становится понятнее — объявление функции одновременно описывает её вызов.

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

Вангую баттхерт питонутых ITT.

Когда к 5.50 появятся именованные параметры, значения по умолчанию, нормальный доступ к стеку из eval { ... }, питон уже поглотит мир. Более того, версия 5.50 будет написана на RPython.

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

ну, мнение выразить не удержался.

Это не мнение, это отладочная запись в логах :)

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

вышеупомянутые циклические ссылки

В перле они также есть. Методами ЯП это решается. Решить в корне и угодить всем? Пока нет, слишком сложно угодить всем.

Утечки могут быть самые разные. Не хочу расписывать детали, ньансы и прочее, так как это мало относится к делу. Любой код, написанный на сях/плюсах потенциально может течь (и не только). Любой код, в том числе и ЯП. С точки зрения ЯП (не только ЯП, любого кода) нужно сделать возможное простым, а невозможное доступным. Циклические ссылки пример невозможного. Однако они доступны разработчикам.

Так что, отбрось свои ощущения на счет руби. Не такой он и плохой. На перле также пишут всякое ^_^

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

Есть такая удобная софтина Octopress. Под 2.хх не завелась. Кому я должен сказать спасибо?

системному администратору, не поставившему тебе под веб-приложение поддерживаемую мажорную версию рантайма (там, конечно, написано про 1.9.3 or greater, но 2.хх — это другая мажорная версия).

по сравнению с jre, после секьюрити апдейта которого перестают работать приложения, это детские проблемы.

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

у нас очень старая версия была и переводить всю инсталляцию шефа на новую версию было стрёмно

воот. практический урок: нефиг использовать протухший шеф из дистрибутива

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

системному администратору, не поставившему тебе под веб-приложение поддерживаемую мажорную версию рантайма (там, конечно, написано про 1.9.3 or greater, но 2.хх — это другая мажорная версия).

Что? Во-первых, я сам себе системный администратор. Во-вторых, я уверен, так же как и я, другой системный администратор без глубоких познаний руби не завел бы данное приложение. Тут вопрос не в том, что это сложно/долго. Нет. Показательно, насколько легко софт ломается, когда ломают API. И показательно, что 2.хх ветка вышла приличное время назад. Насколько помню, Octopress хочет использовать модуль, который не собирается под 2.хх.

по сравнению с jre, после секьюрити апдейта которого перестают работать приложения, это детские проблемы.

Зачетно :) Ява уже не та, что прежде.

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

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

во-вторых, на примере перла: this application requires Perl 4.0.36 or greater. ты запустишь это приложение под 5.х не думая? нет, т. к. это другая _мажорная_ версия рантайма. вот и тут так же

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

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

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

this application requires Perl 4.0.36 or greater. ты запустишь это приложение под 5.х не думая?

Да. Просто потому, что для меня «or greater» означает все что угодно, начиная с такой-то версии. Ну, такой я дуболом :)

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

Это генератор статических страниц

ну а в чём проблема запустить его в поддерживаемом рантайме? вон, в макинтоше в base system аж три версии второго питона (но один перл и один руби) и никто от этого не умер

Да

другая мажорная версия -> несовместимые изменения -> не запустится

я помню, как perl 4 (несовместимый с 5) выпиливали из freebsd base system, запиливали туда пятый, а много позже и его уже совсем из base system вынесли, переписали всё без него

ну, и куча других примеров. мажорная версия — это всё

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

Зачетно :) Ява уже не та, что прежде.

я подобное и при сане видел, а теперь-то вообще

а вот солярис вообще не тот. вон по десятую солярке /bin/sh был не posix-совместимый, в него не добавляли даже конструкцию «export VAR=value» т. к. bug for bug compatibility. а потом пришёл оракл и запилил в качестве /bin/sh нормальный ksh93, а старый шелл тоже положил если кому надо, но в другое место

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

сложная штука — совместимость, в общем. и bug-for-bug не очень хорошо (в виде того же доисторического /bin/sh, не обновлявшегося лет двадцать-тридцать), и активное развитие ломает работающие программы. реальный мир — где-то между

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

http://sourceforge.net/projects/pacmanager/?source=navbar

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

http://www.rexify.org/

чем оно интереснее ансибла?

http://github.com/hinnerk-a/perlids

оно как прокси работает? тяжёленькое, наверное?

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

Во-первых, это быстрее. Положить на стэк три переменные куда быстрее, чем создать хэш, заполнить его, положить указатель на него на стэк, выполнить функцию и сделать GC для хэша и его содержимого. Во-вторых, меньше кода — не нужно лишнее объявление хэша.

Ну вызвать функцию с хэшем не проблема совем:

call({x => 12, y => 34});

Но все-таки быстрее отработает вызов через анонимный массив:

call([qw/12 34/]);

В-третьих, код становится понятнее — объявление функции одновременно описывает её вызов.

Почитал документацию, опопробовал, и, складывается впечатление что смысл сигнатур функции вводится именно для того чтобы можно было четче обозначить внешний интерфейс. Как правило лишь на уровне внешнего интерфейса нужно фокусировать внимание программиста на параметрах вызова. В то же время, внутренние вызовы могут сохранять свою «потоковую натуру» и обработка входных данных может быть реализована без вводя имен скалярам. Интересно тут еще и то что несмотря на ввод сигнатур, обработку входных данных можно реализовать без использования именованных скаляров, т.е. под сигнатурами @_ все еще сохраняет силу. Вообщем все сделано в духе языка perl :). Надо больше на деле пробовать что к чему, но опираться в коде на это сейчас не стоит, т.к. эта фича оставлена экспериментальной.

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

В России не место ползучему скаму и прочему минеральному дерьму. Если не ссышь сказать СВОЮ ПОЗИЦИЮ в лицо и считаешь себя до*?я ынтерпрайзным, то ДАВАЙ ПАРЕНЬ, ИДИ ДО КОНЦА! ОСНОВА ЮНИТИ УЛЬТРАХАРДКОР CPAN ждёт тебя завтра в 15.00 на ВЭДЭХЕ, на остановке 359 автобуса. Приводи кого хочешь, НАМ ПЛЕВАТЬ. Бери своих друзей говнокодеров, школьник, промычи это в лицо СЕМЬЕ И ОСНОВЕ CPAN. Вперёд юнити Perl 5.20!
На правах шутки.

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

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

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

Давай, на правах перло-хейтера, предъявлю поделку на руби, совсем маленькая, альтеранатива perl-rename: взял какой-то rename.rb, но кроме парсилки опций почти все перелопачено: http://codepad.org/c2VdZzlZ , ну еще замена column -t: http://codepad.org/L7oTwff4 (эта правда позже переписана на питон).

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

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

В них всех есть вообще-то.

где нету { и } а есть ужасные begin и end

В руби do .. end заменяемы на {}.

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

Перечитай тред. Из него слабый критик. Хорошо хоть не тролль.

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

Как будто слабая портируемость (программы на другой язык) - достоинство.

А так, думается, python точно дольше проживет (в не-legacy режиме).

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

первое впечатление от python в незапамятные уже времена именно в этом - продуманное творение великих с прищуром дизайнеров и архитекторов неизбежно выльется в узкие места в будущем. Поручень, который удобно ложился в руки, когда ты был мал и прыгуч , вдруг оказывается больно бьёт по ... (ниже пояса) когда ты вдруг обрюзг и потолстел. :)

perl же вырос из навозной кучи awk, поэтому он не написан «c нуля», в том смысле, как python (очередной c[++] с уборкой памяти). C обработкой текста справляется на ура.

Pm7vLB
()

интересно при обновлении сколько приложений свалится :)))

есть статистика?

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

Очень просто, если не уходить с ЛОРа, то входить не требуется. Но тем не менее.

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

Давай, на правах перло-хейтера, предъявлю поделку на руби, совсем маленькая, альтеранатива perl-rename: взял какой-то rename.rb, но кроме парсилки опций почти все перелопачено: http://codepad.org/c2VdZzlZ , ну еще замена column -t: http://codepad.org/L7oTwff4 (эта правда позже переписана на питон).

Где примеру использования, описание, чем оно лучше perl-rename (или примеры использования последнего в аналогичных ситуациях). И сравнение с zmv.

Впрочем, последнее не нужно — ну что это поделие может противопоставить великолепному zmv? Оно даже не приближается к своему противнику (если он — http://search.cpan.org/dist/rename/bin/rename.PL).

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

Где примеру использования, описание, чем оно лучше perl-rename

Да примерно то же самое: устанавливает $_ (и $F: ruby -e спародировал перловские костыли), переименовывает его, если выражение not nil и отлично от $_. Замена дистрибутивному, так что второй - не противник, в выражении же можно 'action ... ; nil', так что остальное можно окостылить (благо навскидку use-case заметно реже, а --link частично покрывается ln --relative).

А zmv вообще гадость, во-первых для «регвыр»-ов нужно модуль подключать, во-вторых в скриптах не упал (прибивать к zsh - «last resort»). Все же ${..${..${..}}} - спорно, сударь вы «completion»-функции писали для этого комбайна? И прибиваться гвоздями к конкретной оболочке - тоже не айс.

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

интересно при обновлении сколько приложений свалится :)))

есть статистика?

Какая статистика? Каких приложении? Чтобы минимизировать риски на обновлениях нужно тестировать свое поделие в песочнице используя perlbrew (менеджер окружения perl). Это что касается практики. Но обычно изучают в perldelta секцию Incompatible Changes чтобы знать какие изменения ядра произошли. Кроме изменении ядра, вместе с ядро интерпретатора изменяются модули и список модулей. Поэтому тестирование желательно если вы не уверены в том что можно ожидать от своих проектов. Лично у меня все мои разработки работают без проблем.

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

А zmv вообще гадость, во-первых для «регвыр»-ов нужно модуль подключать,

Какой ещё модуль? Там только glob’ы от zsh.

во-вторых в скриптах не упал (прибивать к zsh - «last resort»).

У меня полно скриптов на zsh — у него много вкусных возможностей (к примеру, не надо возиться с кавычками, можно менять переменные в cmd | while read i циклах, …) (хотя если что сложное — лучше Python или Perl).

Вообще в скриптах у меня обычно for file in {glob}, а zmv — для интерактивной сессии.

Все же ${..${..${..}}} - спорно, сударь вы «completion»-функции писали для этого комбайна?

Zsh что‐то там дополняет. А зачем вам автодополнение внутри ${…}?

И прибиваться гвоздями к конкретной оболочке - тоже не айс.

Принципиальной разницы между app-shells/zsh в зависимостях и dev-perl/rename или dev-lang/ruby в зависимостях я не вижу. Ничего в моей системе не требует ruby без USE=ruby (или, в одном случае, FEATURES=test).

Две основных причины использовать именно zmv: zmv -W *.txt *.text (это удобнее, чем $1) и zmv -p hg -o mv *.txt subdir/*.txt (ещё zmv даёт возможность использовать в качестве программы функции оболочки, но я этим не пользуюсь). Почему‐то авторам rename.pl не пришло в голову, что иногда мне совершенно не нужно просто переименовать файл в файловой системе.

ZyX
()

как вы вообще на этом ужасе пишете?

язык медленный, скорость разработки - тоже. код нечитаемый и непортабельный.

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

язык медленный

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

скорость разработки - тоже

Есть метрики? Любопытно.

код нечитаемый и непортабельный

Читабельность - суперпозиция квалификаций автора кода и того кто код читает. Портабельность - пока доволен.

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

Какой ещё модуль? Там только glob’ы от zsh.

Ну в обычном zsh/pcre подключался, правда не помню насколько хорошо «интергрировался», ну, значит минус у этого zmv.

У меня полно скриптов на zsh

Ну поздравляю, сдохнет zsh (ну мало ли), ведь это не язык, а костыли над bash (который костыли над стандартом) - сложно будет переписать. И, субъективно, читается сложнее даже чем bash (у меня только один скрипт был, там какая-то морока с массивами, ну и пара десятков compadd, или как их).

cmd | while read i

lastpipe есть, и давно можно было через co-process: ... done < <(..). Кавычки - в скрипте непринципиально, иногда даже чуть легче читать.

автодополнение внутри ${…}?

Не прямую связь обозначил: в zmv вероятны вложенный «substitutions» - получаются подобные конструкции. А их разбор нетривиален (man zshall | grep brain). Дополнения привел как заментый пример, где это явно проявляется: _files, скажем, из пакета.

Принципиальной разницы между app-shells/zsh в зависимостях и dev-perl/rename или dev-lang/ruby

Зато я вижу: с одной стороны язык с _несколькими_ реализациями, худо-бедно есть стандарыт, да и между этими языками в приципе несложно переписывается (особенно с питона); с другой с единственной (да и не совсем язык, а комбайн а-ля емакс, но для командной строки).

Ничего в моей системе не требует ruby без USE=ruby

Левый аргумент, какой-то поверхностный: ибо 1) руби приводил в альтернативу перлу, но поскольку перл прибит, то частичная замена только добавит зависимость => когда будет без USE=perl, тогда поговорим; 2) если хотите именно противопоставить zsh, то конкретизирую: _какой-нибудь_ из ruby/python для скриптов, не покрываемых sh, будет удобнее => отрицание _одного_ ruby ничего не доказывает.

zmv -W *.txt *.text (это удобнее, чем $1)

Неудачный пример, никакого $1 не надо: prename 's/\.txt$/.text/' *.txt

zmv -p hg -o mv *.txt subdir/*.txt

Для скрипта: find -maxdepth 1 -name '*.txt' -exec hg mv {} subdir/{} \;, для командной строки: alias n='for n in'; n *.txt; hg mv $n subdir/ (разумеется, нужна только вторая часть, в баше придется добавить {} и ""). А .txt ... .txt - плохо, можно второй раз опечататься, да и длиннее.

rename.pl не пришло в голову, что иногда мне совершенно не нужно просто переименовать файл в файловой системе

Действительно.. А вообще вангую студентоту, если ошибся - извиняюсь (впрочем, если не ошибся и обиделись - тоже извиняюсь). А так мне лишь не хватает модификаторов ((.)/(/),(x),(@),(/),(L0) etc), global-alias, =command, while {..;} {} (alias -g W='|while {read l;}') и по-мелочи.

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

Читабельность - суперпозиция квалификаций автора кода и того кто код читает.

Не вся правда: повышенная зависимость от первой составляющей.

Портабельность - пока доволен.

Какую часть проекта (и на какой язык) приходилось переписывать, если не секрет?

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