После года разработки представлена (http://www.nntp.perl.org/group/perl.perl5.porters/2013/05/ms...) новая стабильная ветка языка программирования - Perl 5.18 (https://metacpan.org/release/RJBS/perl-5.18.0/). В рамках подготовки нового выпуска было изменено около 400 тыс. строк кода, изменения затронули 2100 файлов, в разработке приняли участие 113 разработчиков.
Ветка 5.18 выпущена в соответствии с утверждённым три года назад фиксированным графиком разработки, подразумевающим выпуск новых стабильных веток раз в год и корректирующих релизов - раз в три месяца. 20 июня планируется выпустить первый корректирующий релиз Perl 5.18.1, в котором будут исправлены наиболее значительные ошибки, выявленные в процессе внедрения Perl 5.18.0. Одновременно с выходом Perl 5.18 прекращена поддержки ветки 5.14, для которой в будущем могут быть выпущены обновления только в случае выявления критических проблем с безопасностью. Также начался процесс разработки экспериментальной ветки 5.19, на базе которой в мае 2014 года будет сформирован стабильный релиз Perl 5.20.
Ключевые улучшения (https://metacpan.org/module/RJBS/perl-5.18.0/pod/perldelta.pod), добавленные в Perl 5.18:- Переработанная реализация хэшей. Одним из самых заметных изменений является обеспечение рандомизации в используемых хэш-функциях, что положительно влияет на безопасность (например, защитит от DoS-атак (http://www.opennet.me/opennews/art.shtml?num=35593) через манипуляции с коллизиями хэшей), но приводит к непредсказуемому порядку вывода элементов функциями keys(), values() и each(). Данное изменение может повлиять на работу приложений, пользующихся недокументированным свойством сохранения порядка записей в разных хэшах (в официальной документации хэши позиционируется как неупорядоченные структуры). Отныне порядок следования идентичных записей в разных хэшах и в одних и тех же хэшах при разных запусках скрипта будут отличаться. Уровень рандомизации может быть настроен через переменную окружения PERL_PERTURB_KEYS (при присвоении значения 0 рандомизация ключей отключается и поведение perl становится как в прошлых выпусках).
Из других изменений можно отметить реализацию возможности использования альтернативных хэш-функций. В качестве алгоритма хэширования по умолчанию задействован ONE_AT_A_TIME_HARD. Кроме того, в состав включено несколько альтернативных алгоритмов, но они, кроме SIPHASH, который считается безопасным, рекомендуются пока только для экспериментов, так как содержат определённые проблемы с безопасностью;
- Новый механизм для активации экспериментальных возможностей и новая категория предупреждений "experimental", управляющая выводом уведомлений для тестовой функциональности. Например, для включения новых экспериментальных возможностей и скрытия связанных с ними предупреждений следует указывать директивы:<font color="#461b7e">
no warnings "experimental::feature_name";
use feature "feature_name";
</font>
- Поддержка (https://metacpan.org/module/perlrecharclass#Extended-Bracket...) экспериментального расширения в системе регулярных выражений, позволяющего осуществлять сопоставления с использованием расширенных правил пересечения, исключения и объединения множеств символов. Например, '[A-Z - W]' - символы от A до Z за исключением W. Более сложный пример формирования множества символов: '[\p{Latin} & \p{L&} - A-Z]'. Функциональность совпадает по возможностям с модулем Unicode::Regex::Set (https://metacpan.org/module/Unicode::Regex::Set);- Экспериментальная поддержка лексических подпрограмм ("lexical_subs (https://metacpan.org/module/perlsub#Lexical-Subroutines)"), позволяющая определять при помощи выражения "state sub" подпрограммы, видимые только в области лексической видимости блока в котором подпрограмма была создана. В отличие от "my sub" процедуры "state sub" работают заметно быстрее, так как они не создаются при каждом входе в блок и совместно используются между вызовами других подпрограмм;
- Возможность использования в операторах next, last и redo динамически вычисляемых меток, формируемых в процессе выполнения скрипта на основе произвольного выражения. Ранее любые отличные от константы аргументы next, last и redo воспринимались как пустая строка;
- В пространство имён "CORE::" включены функции defined, delete, exists, glob, pos, protoytpe, scalar, split, study и undef;
- Поддержка Unicode 6.2 (http://www.unicode.org/versions/Unicode6.2.0) и реализация возможности определения собственных имён символов для использования в \N{...}, charnames::vianame() и т.п. При задании имён могут быть задействованы знаки из диапазона Unicode, т.е. имена символов теперь можно определить не только на английском языке. Использование неизвестных имён символов в \N{...} теперь приводит к ошибке, вместо предупреждения. Указание $/ = \N для функции readline() теперь приводит к чтению N-символов, а не N-байт. Проведены заметные оптимизации скорости работы регулярных выражений в которых присутствуют Unicode символы, например, скорость выполнения операции \X увеличилась на 35-40%;- Интеграция новых контрольных точек для использования в системе динамической отладки DTrace: op-entry, loading-file, loaded-file;
- Добавлена новая служебная переменная ${^LAST_FH} для доступа к последнему прочитанному файловому дескриптору;
- Вертикальная табуляция (\cK) теперь отнесена к множеству символов пробела (\s).
- Обновлены версии большого числа входящих в базовую поставку модулей;- Объявлены устаревшими модули: encoding, Archive::Extract,
B::Lint*,
Devel::InnerPackage,
Log::Message*, Module::Pluggable*,
Object::Accessor,
Pod::LaTeX,
Term::UI*. Прекращена поддержка напрямую вызываемых из системной библиотеки функций для проверки класса символов, например, is_uni_alnum и т.п.; Прекращается поддержка платформ Windows CE, z/OS, DG/UX и NeXT;- В документацию по использованию модуля Storable добавлен пункт, предупреждающий о недопустимости десериализации данных, полученных из недоверительных внешних источников, так как в процессе подобной обработки можно организовать выполнение perl-кода и загрузку модулей;
URL: http://www.nntp.perl.org/group/perl.perl5.porters/2013/05/ms...
Новость: http://www.opennet.me/opennews/art.shtml?num=36968
В тред призываются "хоронители" перла. А я запасаюсь попкорном)
> В тред призываются "хоронители" перла. А я запасаюсь попкорном)ну, вот он я. где же хвалёный пёрл6? когда же уже прекратят насиловать труп и осилят?
надо было подготовиться хоть как-то
про перл6 шутка не модная и давно заезженная
здесь разговор про перл5 сейчас
а я и не шучу, собственно. понятно, что у перлоидов от упоминания перл6 поппеншмерц. но я всё равно не шучу.
Я не знаю, мне перл6 не очень-то нужен. Выпустят, посмотрим, что за зверь.
Сейчас пишу на перле 5, мне его хватает с головой.
Про "недостатки" знаю, 100500 раз уже обсасывалось. Повторюсь, меня всё устраивает. Менять на другой скриптовый язык в ближайшее время не планирую, параллельно изучаю C и C++
упоминание перл6 доставляет только тролям навроде вас
кому нужен язык для работы, просто используют перл5
перл6 нет, и, видимо, не будет
и что характерно, не сильно-то и надо> а я и не шучу, собственно. понятно, что у перлоидов от упоминания
> перл6 поппеншмерц. но я всё равно не шучу.
> упоминание перл6 доставляет только тролям навроде вас
> кому нужен язык для работы, просто используют перл5
> перл6 нет, и, видимо, не будет
> и что характерно, не сильно-то и надо
>> а я и не шучу, собственно. понятно, что у перлоидов от упоминания
>> перл6 поппеншмерц. но я всё равно не шучу.Для новичков не очевидно с чего этого перл6, автор которого ЛариВолл, не является следующей версией после перл5, автор которой всё тот же.
Настанет момент когда он скажет что перл5 уродливый троль - деприкатед, и чё будем делать!??
>> деприкатед, и
> чё будем делать!??Вы - делайте, что хотите.
Нам на вас.
> ну, вот он я. где же хвалёный пёрл6? когда же уже прекратят насиловать труп и осилят?Perl6 - это совершенно другой язык, не имеющий никакого отношения к теме обсуждения.
С тем же успехом вы могли спросить про JS или brainfuck.
> Perl6 — это совершенно другой язык, не имеющий никакого отношения к теме
> обсуждения.а я вижу в сочетаниях «perl5» и «perl6» четыре совпадающих символа из пяти.
впрочем, это в стиле перлистов: чем бредовей всё, тем лучше. подумаешь, другой язык… а назовём-ка мы его тоже перл! чтобы, когда у нас спрашивают: «а где ваш brave new perl6?!» — можно было хитро отвечать: «а перл6 — это другой язык, не продолжение перла5 вообще. как мы вас всех срезали?!»
Все очень просто. Perl6 взялись писать тролли. Из лучших побуждений наверно, но все же ничего хорошего не выходит. Только на форумах троллить могут.Так что все кто работают на перле ждут perl7.
perl6 это новый язык, а не следующая после perl5 версия perl.
> волосы на ладонях от гвидобейсика растут. всем известно. а голых баб лучше
> живьем щупать, нежели в тырнетах смотретьЕму еще рано, мама не разрешает.
> не путаю. мне просто ассемблером заниматься мама запрещает. говорит, что от этого
> волосы на ладонях растут, и пусть я лучше голых баб в
> интернетах смотрю.Ты до сих пор живешь с мамой ? 8)
> Ты до сих пор живешь с мамой ? 8)и собираюсь продолжать это делать. можешь завидовать.
> Питон и перл. Такие дела, мой маленький зеленый друг.[air@hosting ~]# uname -a
Linux hosting 2.6.32-358.6.2.el6.x86_64 #1 SMP Thu May 16 20:59:36 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux[air@hosting ~]# yum remove perl
Removing:
perl x86_64 4:5.10.1-131.el6_4
Removing for dependencies:
MySQL-client x86_64 5.5.16-1.rhel6
cronolog x86_64 1.6.2-1.alex
freetds x86_64 0.82-1.alex
httpd x86_64 2.2.23-alex.1
mc x86_64 1:4.7.0.2-3.el6
perl-Module-Pluggable x86_64 1:3.90-131.el6_4
perl-Pod-Escapes x86_64 1:1.04-131.el6_4
perl-Pod-Simple x86_64 1:3.13-131.el6_4
perl-libs x86_64 4:5.10.1-131.el6_4
perl-version x86_64 3:0.77-131.el6_4
php x86_64 5.3.21-alex.1---
Итого: 6/12 - сама перлятина, из freetds/httpd/mysql-client легко выпиливается - как правило зависимости создают либы для самой перлятины или ненужные хелперы, за mc и cronolog не скажу - надо поглядеть. php перла не требует - вываливается из-за httpd и freetds.
Такие дела, мой маленький наивный друг.
>x86_64 x86_64 x86_64 GNU/Linuxа почему только 3 раза?)
>>x86_64 x86_64 x86_64 GNU/Linux
> а почему только 3 раза?)Потому что архитектура i386, это 3 раза по 86
>>>x86_64 x86_64 x86_64 GNU/Linux
>> а почему только 3 раза?)
> Потому что архитектура i386, это 3 раза по 86да нет, чтобы из i386 получить x86_64 надо начертить круг, встать в его центр и 4 раза произнести "x86_64" ))
Хммм ... а z/OS то, почему выпилили ?
Когда уже допилят этот несчастный Regex до полноценного языка программирования высокого уровня?
чтобы любой текстушный бред на входе компилировал в бинарь, делающий что-то осмысленное и полезное.
> чтобы любой текстушный бред на входе компилировал в бинарь, делающий что-то осмысленное
> и полезное.Fortran?
Грамматики Perl6 ждут вас. :)
Баттхерт при виде регулярного выражения? Хочется немедленно удалить строку и расписать нормальным алгоритмом строк на 100? Попробуйте сменить профессию...
Жрать кактусы отнюдь не в духе перловиков. Ведь их зарплаты выше чем си, питон, пхп,...
> Баттхерт при виде регулярного выражения? Хочется немедленно удалить строку и расписать
> нормальным алгоритмом строк на 100? Попробуйте сменить профессию…батхёрт при виде того, как регулярки пытаются использовать для парзинга.
> приводит к непредсказуемому порядку вывода элементов функциями keys(), values() и each()давно обещали, наконец сделали
теперь куча кода, которая полагалось на одинаковый порядок keys() и values() будет вести себя непредсказуемо> Возможность использования в операторах next, last и redo динамически вычисляемых меток
welcome to spagetti code
> Добавлена новая служебная переменная ${^LAST_FH}
ещё одна возможность написать непонятный код
возможно, пригодится при написании тестов к legacy-модуляма так молодцы
>> приводит к непредсказуемому порядку вывода элементов функциями keys(), values() и each()
> давно обещали, наконец сделали
> теперь куча кода, которая полагалось на одинаковый порядок keys() и values() будет
> вести себя непредсказуемоА нефиг полагаться на особенности реализации. В документации про это
было явно сказано.
Хотя видел тексты одного "индийского" дятла (на PL/SQL) где гражданин
полагался на определенный порядок строк в результате SELECT-а
без указания сортировки.
Почти полгода процедура работала "правильно".
К сожалению я тоже такое выдел.
В первом же абзаце perldata:
Hashes are unordered collections of scalar values indexed by their associated string key.Они по-определению неупорядочены.
Так что, если кто-то писал кучу кода, "которая полагалось на одинаковый порядок keys() и values()", то этот кто-то - дурак, не читающий доков.
как показывает практика, доки мало кто читает. одно из самых красивых доказательств тому — не столь давнее изменение поведения memcpy(). стандарт не нарушен, man остался такой же — а у СуперПрограммеров дупы повыворачивало.
В Перл таких не берут.
> В Перл таких не берут.их там разводят?
>> В Перл таких не берут.
> их там разводят?Ну откуда у вас в лексиконе такие слова ? Перлом пользуются высокообразованные люди которые пишут пограммы а не разводят бабушек на выборы гречкой.
а мне намного более удивительно, что может знать о культуре и высокообразованности человек, которому при виде слова «разводят» первым делом приходит в голову жаргонное значение слова, а не конвенциально-словарное.
> а мне намного более удивительно, что может знать о культуре и высокообразованности
> человек, которому при виде слова «разводят» первым делом приходит в голову
> жаргонное значение слова, а не конвенциально-словарное.Не судите по себе всех ...
да я не о всех, а о тебе. и не по себе — это же не мне в голову приходит первым делом сленговое толкование.
Радуют.
А вот с z/OS - неприятный сюрприз.
Хоть и не часто, но требуется мне там Perl.
Подскажите, где используется данная система?
> Подскажите, где используется данная система?На IBM mainframe - System/z.
Статуя Капитана Очевидности из чистого серебра в полный рост :D
> Подскажите, где используется данная система?в Кровавом Интырпрайзе. Кровавый Интырпрайз любит только зарабатывать, а потратить немного заработанного на модернизацию — не любит. удавится скорее.
> в Кровавом Интырпрайзе. Кровавый Интырпрайз любит только зарабатывать, а потратить немного заработанного на модернизацию — не любит. удавится скорее.Сменить мейнфрейм на старый пенек, чтобы админам локалхостов не так завидно было?
Действительно, и я бы пожадничал. Пусть локалхосты и дальше завидуют! :D
тихо, что ты контору палишь? всю еду распугаешь!
use Perl5.16, Perl5.14 ...Welcome!
> А вот с z/OS - неприятный сюрприз.
> Хоть и не часто, но требуется мне там Perl.Там как был 5.6, так и остался. Даже в z/Linux тоже 5.6.
> Объявлены устаревшими модули
> Прекращена поддержкатеперь хотелось бы услышать перловодов, которые обвиняли питон в отсутствии обратной совместимости, приводя в контрпример перл.
> теперь хотелось бы услышать перловодов, которые обвиняли питон в отсутствии обратной совместимости, приводя в контрпример перл.По сравнению с питоном - практически у любого языка хорошая обратная совместимость. В том числе и у перла.
И эти люди идут потом в новости про PHP кричать, что он уродливый в том числе оттого, что из него кучу legacy всё никак не выкинут.
> И эти люди идут потом в новости про PHP кричать, что он
> уродливый в том числе оттого, что из него кучу legacy всё
> никак не выкинут.Набралась куча легаси - замути новый язык, а старый не трожь.
Ну Python2 и Python3 тоже как бы разные ветки языка. :)
>> Объявлены устаревшими модули
>> Прекращена поддержка
> теперь хотелось бы услышать перловодов, которые обвиняли питон в отсутствии обратной совместимости,
> приводя в контрпример перл.А что у вас не работает ? Пример кода напишите.
В перле поддержка прекращается того, что либо некому поддерживать,либо того, что по факту сто лет как не используется. По "идеологическим" причинам ничего не выбрасывается.
> теперь хотелось бы услышать перловодов, которые обвиняли питон в отсутствии обратной совместимости,
> приводя в контрпример перл.Боюсь в этом споре ничего не изменилось: в питоне действительно отсутствует обратная совместимость между версиями. В перле она есть. Если вы потрудитесь перечитать новость - поймете сами.
> Если вы потрудитесь перечитать новость - поймете сами.Читать новость - значит отступать от юникс-вея (который описывается принципом "не читал, но осуждаю").
>> теперь хотелось бы услышать перловодов, которые обвиняли питон в отсутствии обратной совместимости,
>> приводя в контрпример перл.
> Боюсь в этом споре ничего не изменилось: в питоне действительно отсутствует обратная
> совместимость между версиями. В перле она есть. Если вы потрудитесь перечитать
> новость - поймете сами.ну-ну. перечитываю новость:
"""
...Использование неизвестных имён символов в \N{...} теперь приводит к ошибке, вместо предупреждения. Указание $/ = \N для функции readline() теперь приводит к чтению N-символов, а не N-байт...
"""опять "перл самый лучший"?! фанатики такие фанатики))
> """
> ...Использование неизвестных имён символов в \N{...} теперь приводит к ошибке, вместо предупреждения.
> Указание $/ = \N для функции readline() теперь приводит к чтению
> N-символов, а не N-байт...
> """А теперь сравните это со списком изменений python2 -> python3. Только сковородку подложите, чтобы стул не прожечь =)
> А теперь сравните это со списком изменений python2 -> python3.а зачем? питон3 — это другой язык, а не следующая версия питон2. ребятушки, это же ваш любимый аргумент про перл6, и вы так глупо подставляетесь.
Пытаюсь понять почему вы пишете о вещах, о которых не имеете бледного понятия. Perl6 - именно, что другой язык, отличающийся от классического Перла ОЧЕНЬ сильно. Между версиями Питона ничего принципиального не менялось. Если не считать поломаной совместимости, конечно :)
может, потому, что у меня не «бледное» понятие.
> теперь хотелось бы услышать перловодов, которые обвиняли питон в отсутствии обратной совместимости, приводя в контрпример перл.PERL_PERTURB_KEYS (при присвоении значения 0 рандомизация ключей отключается и поведение perl становится как в прошлых выпусках).
Теперь, питоновод, объясни как в питоне вернуть старое поведение хоть для чего-нибудь?
если совместимость python2 и 3, то "six"если о возможностях в новых версиях:
from __future__ import ...
в остальном философия языка другая, в питоне определенная вещь решается оптимизированно и определенно, он не подталкивает к разброду и шатанию по дебрям.
>определенная вещь решается оптимизированно и определенноИ что это за такая тавтологически определённая вещь?
В Советском Союзе тоже всё было во имя и на благо человека. Некоторые даже догадывались, о каком именно человеке шла речь.
>>определенная вещь решается оптимизированно и определенно
> И что это за такая тавтологически определённая вещь?
> В Советском Союзе тоже всё было во имя и на благо человека.
> Некоторые даже догадывались, о каком именно человеке шла речь.Тонкий вброс расчитанный на школоту ? Форумом не ошиблись ?
Он не может ошибиться форумом. Для этого нужно понимать о чем говоришь.
> from __future__ import ...Так значит они додумались сделать как в перле
use feature ...
еще бы так же лаконично смотрелось как в перле
>еще бы так же лаконично смотрелось как в перлекстати, о импортах.
возможна ли в perl конструкция вида import foo as bar
например, заменить штатные регекспы альтернативной версией(например, гугловский re2)?
В перле регэкспы встроены в ядро. Менять их ни на что не нужно.
ну-ну. смотрим:http://snowplow.org/martin/rebench/
~/bench$ perl rebench.pl
Text type: two regexps plain alternate la alternate prefix alternate FOO+ alternate F+OO alternate plain FOO BAR BAZ
plain unmatching 15.52 usecs 19.29 usecs 19.29 usecs 19.28 usecs 26.1 usecs 19.29 usecs 8.636 usecs
early FOO BAR 15.47 usecs 19.6 usecs 19.58 usecs 19.58 usecs 26.47 usecs 40.13 usecs 8.614 usecs
early FOO BAR BAZ 2.792 usecs 7.581 usecs 7.533 usecs 7.528 usecs 9.625 usecs 11.92 usecs 2.775 usecs
early FOO MORK MINK 10.89 usecs 7.533 usecs 7.556 usecs 7.519 usecs 9.636 usecs 11.9 usecs 8.621 usecs
end FOO BAR 15.47 usecs 19.58 usecs 19.56 usecs 19.56 usecs 26.49 usecs 33.84 usecs 8.635 usecs
end FOO BAR BAZ 8.702 usecs 20.81 usecs 20.79 usecs 20.85 usecs 27.66 usecs 35.07 usecs 8.646 usecs
end FOO MORK MINK 15.46 usecs 20.79 usecs 20.81 usecs 20.77 usecs 27.65 usecs 35.07 usecs 8.611 usecs~/bench$ python rebench.py
Text type: prefix alternate plain alternate two regexps FOO+ alternate F+OO alternate la alternate plain FOO BAR BAZ
plain unmatching 22.65 usecs 113 usecs 42.55 usecs 21.3 usecs 307.2 usecs 378.4 usecs 21.28 usecs
early FOO BAR 21.45 usecs 113.3 usecs 51.53 usecs 21.42 usecs 304.8 usecs 375.4 usecs 21.31 usecs
early FOO BAR BAZ 6.704 usecs 34.21 usecs 6.555 usecs 6.678 usecs 91.95 usecs 114 usecs 6.545 usecs
early FOO MORK MINK 6.703 usecs 34.21 usecs 27.84 usecs 6.697 usecs 91.84 usecs 113.7 usecs 21.29 usecs
end FOO BAR 21.44 usecs 114.5 usecs 42.55 usecs 21.42 usecs 305.2 usecs 376 usecs 21.3 usecs
end FOO BAR BAZ 21.46 usecs 112.9 usecs 21.27 usecs 21.41 usecs 306.5 usecs 374.7 usecs 21.26 usecs
end FOO MORK MINK 21.47 usecs 112.8 usecs 42.53 usecs 21.47 usecs 305.4 usecs 374.9 usecs 21.28 usecsа теперь меняем всего одну строчку в коде(вместо import re пишем import regex as re):
~/bench$ python rebench.py
Text type: prefix alternate plain alternate two regexps FOO+ alternate F+OO alternate la alternate plain FOO BAR BAZ
plain unmatching 14.5 usecs 14.45 usecs 18.41 usecs 14.43 usecs 14.46 usecs 14.42 usecs 10.31 usecs
early FOO BAR 14.57 usecs 14.57 usecs 18.35 usecs 14.63 usecs 19.08 usecs 14.84 usecs 10.27 usecs
early FOO BAR BAZ 6.233 usecs 6.171 usecs 3.374 usecs 5.298 usecs 9.726 usecs 5.563 usecs 3.35 usecs
early FOO MORK MINK 5.777 usecs 5.693 usecs 12.94 usecs 5.351 usecs 10.65 usecs 5.187 usecs 10.27 usecs
end FOO BAR 14.6 usecs 14.55 usecs 18.37 usecs 14.61 usecs 28.89 usecs 14.83 usecs 10.25 usecs
end FOO BAR BAZ 18.51 usecs 19.78 usecs 10.35 usecs 17.24 usecs 32.33 usecs 16.8 usecs 10.31 usecs
end FOO MORK MINK 17.76 usecs 17.21 usecs 18.36 usecs 17.06 usecs 33.07 usecs 15.25 usecs 10.26 usecsа теперь import re2 as re:
~/bench$ python rebench.py
Text type: prefix alternate plain alternate two regexps FOO+ alternate F+OO alternate la alternate plain FOO BAR BAZ
plain unmatching 1.32 usecs 1.28 usecs 2.633 usecs 1.282 usecs 1.295 usecs 378.8 usecs 1.291 usecs
early FOO BAR 1.359 usecs 1.633 usecs 2.814 usecs 1.402 usecs 1.389 usecs 377.1 usecs 1.394 usecs
early FOO BAR BAZ 1.185 usecs 1.196 usecs 2.613 usecs 1.194 usecs 1.252 usecs 114.2 usecs 1.135 usecs
early FOO MORK MINK 1.221 usecs 1.211 usecs 2.611 usecs 1.237 usecs 1.264 usecs 114.2 usecs 1.388 usecs
end FOO BAR 1.35 usecs 1.358 usecs 2.757 usecs 1.362 usecs 1.377 usecs 377.4 usecs 1.366 usecs
end FOO BAR BAZ 1.733 usecs 1.719 usecs 3.054 usecs 1.774 usecs 1.742 usecs 382.6 usecs 1.66 usecs
end FOO MORK MINK 1.81 usecs 1.782 usecs 3.076 usecs 1.808 usecs 1.799 usecs 380.8 usecs 1.345 usecsвнезапно, ускорение в ~ 22 раза относительно первоначального варианта и в 10-15 раз быстрее libpcre и цена такого ускорения - поправить строчку импорта.
в более умном варианте это всё надо обернуть в try/except, сделав fallback на более медленную версию(как, кстати, такое сделать в perl?).
сравнивать pcre и re2 как минимум некорректно: они не полностью взаимозаменяемы.(офф) впрочем, тут видно общую беду всех бектрэкинговых движков. к сожалению, регулярки у перла требуют бэктрекинга. хотя tre, например, пытается сочетать приятное из обоих миров.
> сравнивать pcre и re2 как минимум некорректно: они не полностью взаимозаменяемы.да, я в курсе :) и лишь хотел показать пример зачем вообще это нужно и как легко это может быть. т.е. если в решамой задаче такая замена допустим - why not?
как альтернатива, можно звать на помощь jit:http://morepypy.blogspot.ru/2010/06/jit-for-regular-expressi...
дык в перле, в принципе, никто не мешает использовать другие движки. но обычно всем просто лень, потому что патологические случаи научились «нюхом чуять».
" This test was performed using stock cygwin installs of perl 5.8.7, python 2.4.1, and ruby 1.8.4 on a 1.2 GHz laptop with 512MB of installed physical memory. Just for fun, I also compiled perl 5.9.3 on cygwin with defaults (except with -O3, since the stock perl had that) and tested that too. In a further fit of insanity, on 2006-03-01 I grabbed the latest bleadperl, (compiled as 5.9.3) and tested that too. "Вы бы ещё тесты двадцатилетней давности представили.
> " This test was performed using stock cygwin installs of perl 5.8.7,
> python 2.4.1, and ruby 1.8.4 on a 1.2 GHz laptop with
> 512MB of installed physical memory. Just for fun, I also compiled
> perl 5.9.3 on cygwin with defaults (except with -O3, since the
> stock perl had that) and tested that too. In a further
> fit of insanity, on 2006-03-01 I grabbed the latest bleadperl, (compiled
> as 5.9.3) and tested that too. "
> Вы бы ещё тесты двадцатилетней давности представили.выше цифры тестов, запущенные на моем десктопе. core i7 3770/32Gb ram, с выключенным энергосбережением.
perl v5.14.2, Python 2.7.4, linux 3.9.2, x86_64
эмм...подскажите, а где взять эти re2 и regexp ? Хочу протестировать
> эмм...подскажите, а где взять эти re2 и regexp ? Хочу протестироватьpip install regex
pip install re2
regex однако впечатлил. Поставить re2 мне не удалось, так как требуется тянуть библиотеку с code.google
Но всё-равно, разрабы молодцы.
> выше цифры тестов,
> perl v5.14.2, . . . , linux 3.9.2, x86_64Ядро предпоследнее -- актуально v3.9.3 2013-05-19
Perl 5.14.X -- специально?
( Заодно: почему .2 ? v5.14.2 ? Даже у ActivePerl -- v5.14.4.1405 )
уже года два 5.16 , интересно было бы посмотреть цифры для новейшего 5.18
Итого: Perl часть теста -- практически не очень актуальнаКстати, делали ли reboot системы imm.before/перед запуском теста?
> Вы бы ещё тесты двадцатилетней давности представили.да хоть столетней — бэктрекинговые движки просто в силу алгоритма будут тормознее, непредсказуемей и с завидной радостью заваливающиеся в «тёмные углы». универсальней, с большим количеством фич — и тормознее. если только это не «комбинированый» движок, который в бэктрекинг «сваливается» только по необходимости.
но демонстрация-то была даже не этого, а того, что в перле есть Единственно Верный Движок, увы, который так просто на другой не заменишь. такой дизайн. кисмет.
>> Вы бы ещё тесты двадцатилетней давности представили.
> да хоть столетней — бэктрекинговые движки просто в силу алгоритма будут тормознее,
> непредсказуемей и с завидной радостью заваливающиеся в «тёмные углы». универсальней,
> с большим количеством фич — и тормознее. если только это не
> «комбинированый» движок, который в бэктрекинг «сваливается» только
> по необходимости.
> но демонстрация-то была даже не этого, а того, что в перле есть
> Единственно Верный Движок, увы, который так просто на другой не заменишь.
> такой дизайн. кисмет.прежде чем сказать глупость, проверили бы сами. Я не поленился и тоже скачал скрипты и прогнал тесты. Тесты показали, что работа регулярок в перле в разы(в некоторых местах до 8-ми раз) быстрее, чем в питоне.
Но это не самое печальное. Печально то, что работа тестового python-скрипта в 10(!!) раз медленне, чем работа тестового perl-скрипта. o_Otime perl rebench.pl
...
real 0m2.985s
user 0m2.948s
sys 0m0.008stime python rebench.py
...
real 0m23.362s
user 0m22.977s
sys 0m0.136sДаже не знаю, стоит ли этого того, чтобы с понтом дела заявлять "а ничего, зато у нас есть 100500 библиотек для работы с регулярками и ещё мы можем написать динамическую опердень вида import foo as bar".
Я теперь понимаю, почему мой коллега, python-разработчик крайне негативно относится к регулярным выражениям.P.S. к языку Python отношусь нейтрально
(вздыхает) я вообще не считаю Новый Whitespace нормальным языком. и речь я вёл вовсе не о нём. но это всё в принципе не важно, потому что нет у меня сегодня ни настроения ругаться, ни настроения что-либо растолковывать. муть это всё бессмысленная.
> прежде чем сказать глупость, проверили бы сами. Я не поленился и тоже
> скачал скрипты и прогнал тесты. Тесты показали, что работа регулярок в
> перле в разы(в некоторых местах до 8-ми раз) быстрее, чем в
> питоне.всё это есть в тестах выше. но я уже писал, что:
import regex as re и с LOOPS=10000 цифры уже такие:
~/bench$ time perl rebench.pl
Text type: two regexps plain alternate la alternate prefix alternate FOO+ alternate F+OO alternate plain FOO BAR BAZ
plain unmatching 15.5 usecs 19.47 usecs 19.35 usecs 19.27 usecs 26.09 usecs 19.34 usecs 8.721 usecs
early FOO BAR 15.38 usecs 19.61 usecs 19.53 usecs 19.54 usecs 26.49 usecs 40.17 usecs 9.69 usecs
early FOO BAR BAZ 2.886 usecs 7.477 usecs 7.498 usecs 7.465 usecs 10.05 usecs 12.98 usecs 2.823 usecs
early FOO MORK MINK 11.23 usecs 7.931 usecs 7.869 usecs 7.763 usecs 9.971 usecs 12.24 usecs 8.833 usecs
end FOO BAR 15.8 usecs 19.86 usecs 19.53 usecs 19.5 usecs 26.36 usecs 33.92 usecs 8.624 usecs
end FOO BAR BAZ 8.63 usecs 20.67 usecs 20.68 usecs 20.62 usecs 27.62 usecs 35.01 usecs 8.639 usecs
end FOO MORK MINK 15.42 usecs 20.69 usecs 20.86 usecs 20.65 usecs 28.32 usecs 35.13 usecs 8.66 usecsreal 0m8.313s
user 0m8.283s
sys 0m0.024s~/bench$ time python rebench.py
Text type: prefix alternate plain alternate two regexps FOO+ alternate F+OO alternate la alternate plain FOO BAR BAZ
plain unmatching 14.54 usecs 14.49 usecs 18.34 usecs 14.42 usecs 14.64 usecs 14.66 usecs 10.23 usecs
early FOO BAR 14.55 usecs 14.5 usecs 18.27 usecs 14.55 usecs 19.18 usecs 15.09 usecs 10.2 usecs
early FOO BAR BAZ 4.788 usecs 4.726 usecs 3.358 usecs 4.816 usecs 9.614 usecs 6.057 usecs 3.317 usecs
early FOO MORK MINK 5.112 usecs 5.068 usecs 12.84 usecs 5.183 usecs 9.639 usecs 5.872 usecs 10.18 usecs
end FOO BAR 14.48 usecs 14.45 usecs 18.22 usecs 14.59 usecs 28.7 usecs 15.96 usecs 10.19 usecs
end FOO BAR BAZ 14.73 usecs 14.92 usecs 10.28 usecs 14.78 usecs 30.31 usecs 18.04 usecs 10.26 usecs
end FOO MORK MINK 15.53 usecs 15.12 usecs 18.31 usecs 16.44 usecs 30.15 usecs 17.61 usecs 10.23 usecsreal 0m6.537s
user 0m6.534s
sys 0m0.002s> Я теперь понимаю, почему мой коллега, python-разработчик крайне негативно относится к регулярным
> выражениям.у них главная беда в том, что они write-only.
> у них главная беда в том, что они write-only.возможно. Но в перле регулярки использовать удобно. Повторюсь, они встроены в ядро языка и позволяют делать различные плюшки вида
my $var = "this is text";
if ($var =~ qr/^(this).+(text)$/) {
print "$1\t$2\n";
}напечатает "this text".
Возможно, использование регулярок в питоне связано с тем, что они не вписываются в общую концепцию языка и питонщики ими редко пользуются. Но перловики их(регэкспы) используют в полный рост, главное - не перебарщивать.
>> у них главная беда в том, что они write-only.
> возможно. Но в перле регулярки использовать удобно. Повторюсь, они встроены в ядро
> языка и позволяют делать различные плюшки видасмысл практический в этом? hardcoded pattern'ы?
> Возможно, использование регулярок в питоне связано с тем, что они не вписываются
> в общую концепцию языка и питонщики ими редко пользуются.нет смысла в регекспах внутри языка. совсем. да, ими можно парсить json/html/xml и чёрта в ступе. но в самом языке они не нужны.
>Но перловики
> их(регэкспы) используют в полный рост, главное - не перебарщивать.для чего? они вам не помогут работать с бинарными данными или же алгоритмах.
вот если вам надо ускорить кусок кода на perl, что вы будете делать?
> смысл практический в этом? hardcoded pattern'ы?а в чём вообще смысл использования регулярных выражений?
> нет смысла в регекспах внутри языка. совсем. да, ими можно парсить json/html/xml и чёрта в ступе. но в самом языке они не нужны.
никто в здравом уме не будет парсить JSON/XML/HTML с помощью регулярок. Для этого уже сто лет как написаны отдельные модули
> для чего? они вам не помогут работать с бинарными данными или же алгоритмах.
> вот если вам надо ускорить кусок кода на perl, что вы будете делать?опять таки, для чего нужны регулярные выражения? Мой ответ - для работы с текстом. Для работы с бинарными данными используются другие средства.
Если надо ускорить кусок перлового кода, то существует ровно 2 способа:
1. Переписать(отрефакторить) указанный кусок не используя тяжёлые конструкции
2. Переписать данный код на C и подключить с помощью XS
> а в чём вообще смысл использования регулярных выражений?достаточно редкие ситуации, когда нет желания писать полноценный парсер или же какие-то простые случаи.
> опять таки, для чего нужны регулярные выражения? Мой ответ - для работы
> с текстом.ну так работа с текстом - это не такая частая задача, чтобы делать регекспы частью языка.
более того, цифры выше - это не про скорость, а про сравнительно легкий способ ускориться не переписывая всё. (собственно, это тесты сишного кода/библиотек, а не языка).> Для работы с бинарными данными используются другие средства.
а что именно для этого есть в perl?
в python, например, есть штатный модуль struct.
> Если надо ускорить кусок перлового кода, то существует ровно 2 способа:
> 1. Переписать(отрефакторить) указанный кусок не используя тяжёлые конструкции
> 2. Переписать данный код на C и подключить с помощью XS3. можно еще распараллелиться
4. в случае с python есть cython(да, для нормального ускорения нужна статическая типизация).
5. в случае с python есть pypy и его jit. тут переписывать вообще не надо.
> достаточно редкие ситуации, когда нет желания писать полноценный парсер или же какие-то простые случаи.я не знаю как в питоне, но в разработке на перле мне периодически, не так уж и редко приходится сталкиваться с подобными задачами. И под каждую из задач не напишешь парсер.
> в python, например, есть штатный модуль struct.
в перле не дураки сидят, pack и unpack тоже имеется
> 3. можно еще распараллелиться
Это усложняет разработку, но да, согласен. Это вариант.
> 4. в случае с python есть cython(да, для нормального ускорения нужна статическая типизация).
> 5. в случае с python есть pypy и его jit. тут переписывать вообще не надо.язык перл не имеет спецификации, поэтому у него только один интерпретатор. Но я не считаю это проблемой, т.к. возможностей и скорости работы языка хватает для бОльшей части задач. Для всего остального есть старый добрый Си.
> я не знаю как в питоне, но в разработке на перле мне
> периодически, не так уж и редко приходится сталкиваться с подобными задачами.
> И под каждую из задач не напишешь парсер.например?
>> 3. можно еще распараллелиться
> Это усложняет разработку, но да, согласен. Это вариант.никакого усложнения. если изначально писать нормально и использовать map.
> язык перл не имеет спецификации, поэтому у него только один интерпретатор. Но
> я не считаю это проблемой, т.к. возможностей и скорости работы языка
> хватает для бОльшей части задач. Для всего остального есть старый добрый
> Си.ну вот там ниже есть пример десятикратного ускорения с переходом на pypy.
си - это когда уже совсем всё плохо.а вот что в перле грустно, так это http://perldoc.perl.org/threads/shared.html#BUGS-AND-LIMITAT...
> ну так работа с текстом - это не такая частая задача, чтобы
> делать регекспы частью языка.Смешно. Настолько смешно, что даже объяснять что-либо не хочется.
> более того, цифры выше - это не про скорость, а про сравнительно
> легкий способ ускориться не переписывая всё. (собственно, это тесты сишного кода/библиотек,
> а не языка).Если вы не умеете пользоваться всей мощью регексов это не значит, что этого не умеют другие. А регексы re2 весьма сильно ограничены и код переписывать под них придется. Ну или воспользоваться модулем, который умеет fallback в стандартные регексы
>> Для работы с бинарными данными используются другие средства.
> а что именно для этого есть в perl?
> в python, например, есть штатный модуль struct.Нравится по граблям топтаться? pack/unpack встроенны в perl и конечно же имеют больше возможностей чем питоновские из struct
> 3. можно еще распараллелиться
Или поставить более мощный процессор, или дать больше памяти, или увеличить пропускную способность IO. Это экстенсивный путь, мы не о нем.
> 4. в случае с python есть cython(да, для нормального ускорения нужна статическая
> типизация).Это конечно тоже имеет право на жизнь, но как по мне, ускорять надо не программу в целом, жертвуя возможностями языка, а проблемный кусок кода. И ситуация, когда работоспособность кода на ЯП зависит от используемого транслятора, мне не кажется верным подходом. Кстати для perl давным давно была возможность превращать весь код в C, но она толком никому не была нужна и ее забросили, зато создали несколько различных способов подключать C код.
> 5. в случае с python есть pypy и его jit. тут переписывать
> вообще не надо.Если там так все хорошо, то почему pypy болтается на задворках, а не вытеснил другие реализации?
> Если вы не умеете пользоваться всей мощью регексов это не значит, что
> этого не умеют другие. А регексы re2 весьма сильно ограничены и
> код переписывать под них придется. Ну или воспользоваться модулем, который умеет
> fallback в стандартные регексыеще раз:
1)вы переоцениваете важность регекспов.
2)пример выше про легкость замены, а не о совместимости. т.е. там, где это допустимо.более того, можно использовать одновременно оба движка, в том числе разнеся их по разным cpu.
> Нравится по граблям топтаться? pack/unpack встроенны в perl и конечно же имеют
> больше возможностей чем питоновские из structо, можно подробнее про грабли? и чего нет в питоновском struct?
>> 3. можно еще распараллелиться
> Или поставить более мощный процессор, или дать больше памяти, или увеличить пропускную
> способность IO. Это экстенсивный путь, мы не о нем.если у вас в системе 32cpu и они ничем не загружены - почему бы и нет?
>> 4. в случае с python есть cython(да, для нормального ускорения нужна статическая
>> типизация).
> Это конечно тоже имеет право на жизнь, но как по мне, ускорять
> надо не программу в целом, жертвуя возможностями языка, а проблемный кусок
> кода.ну так о куске кода и речь. профайлером нашли горячий кусок, вынесли в модуль, а дальше cython. тем более, что cython с ключём '-a' сгенерирует красивый отчёт и подскажет, что надо типизировать в первую очередь.
> И ситуация, когда работоспособность кода на ЯП зависит от используемого
> транслятора, мне не кажется верным подходом. Кстати для perl давным давно
> была возможность превращать весь код в C, но она толком никому
> не была нужна и ее забросили, зато создали несколько различных способов
> подключать C код.ну так cython так и умеет. только ускорение от прямой трансляции невелико, потому и забросили в perl.
>> 5. в случае с python есть pypy и его jit. тут переписывать
>> вообще не надо.
> Если там так все хорошо, то почему pypy болтается на задворках, а
> не вытеснил другие реализации?откуда ж мне знать? народ весьма консервативен.
~/bench$ python levbench.py
st1 == 7800 bytes, st2 == 8580 bytes
27.2362930775
~/bench$ pypy levbench.py
st1 == 7800 bytes, st2 == 8580 bytes
2.71952915192один и тот же код, взятый тут:
http://en.wikibooks.org/wiki/Algorithm_Implementation/String...
> 1)вы переоцениваете важность регекспов.Стандартное заблуждение тех, кто их толком не освоил. Также не исключен вариант, что вы просто применяете готовые модули парсинга и не знаете, что у них под капотом, вот вам и кажется, что регексы не нужны. Про другую крайность - когда все пытаются сделать одним навороченным регексом - я в курсе и тоже ее не одобряю.
> 2)пример выше про легкость замены, а не о совместимости. т.е. там, где
> это допустимо.Ну так вам и привели пример, что в perl это тоже легко заменяется, причем с fallback да еще и разными способами.
> более того, можно использовать одновременно оба движка, в том числе разнеся их
> по разным cpu.У вас явно сдвиг на тему параллельности, прочитали "умную" книжку и везде теперь видите гвозди?
> о, можно подробнее про грабли? и чего нет в питоновском struct?
Перл богаче питона по возможностям, его идеология "есть много способов снять шкурку с кошки", в отличии от питоновской "есть только один одобренный фюрером способ снятия шкурки с кошки". Но вы раз разом пытаетесь найти в perl отсутствие возможностей из python. По поводу конкретно pack - просто сравните мануалы по обоим.
> если у вас в системе 32cpu и они ничем не загружены -
> почему бы и нет?А если их нет, то так и останетесь как дурак с тормозным кодом, который зато круто может распараллелится? Ну это не считая того, что далеко не всякую задачу можно успешно распараллелить и CPU не всегда слабое место.
можно, но сам не пробовал; задач для которых это критично не было
http://search.cpan.org/~dgl/re-engine-RE2-0.11/lib/re/engine...Наслаждайся.
ЗЫ
На YAPC::2012 чувак делал про это движок довольно подробный доклад. Думаю можешь найти в сети.
> http://search.cpan.org/~dgl/re-engine-RE2-0.11/lib/re/engine...
> Наслаждайся.
> ЗЫ
> На YAPC::2012 чувак делал про это движок довольно подробный доклад. Думаю
> можешь найти в сети.ну хоть один хороший и правильный коммент :))
> возможна ли в perl конструкция вида import foo as barВ perl возможно все, чаще всего минимум двумя способами. Спрашивать, есть ли в perl что-то из python, можно только смеху ради. Конкретно эта фича легко реализуется за счет того, что таблицы символов это просто хеши и работает конструкция вида %Bar::=%Foo::
>> возможна ли в perl конструкция вида import foo as bar
> В perl возможно все, чаще всего минимум двумя способами. Спрашивать, есть ли
> в perl что-то из python, можно только смеху ради. Конкретно эта
> фича легко реализуется за счет того, что таблицы символов это просто
> хеши и работает конструкция вида %Bar::=%Foo::как бы при импорте много чего происходит, а не только модификация таблицы символов.
>>> import os
>>> globals()['oos'] = os
>>> del globals()['os']
>>> oos<module 'os' from '/usr/lib/python2.7/os.pyc'>
но это всё - игры с внутренними структурами интерпретатора.
так то я могу взять inspect и в рантайме узнавать кто позвал ту или иную функцию, из какой строчки и какими аргументами. если же совсем извращаться, то можно лазить по стэку вызовов и патчить чужой код.
так что речь не о хаках, а штатных возможностях языка.
> так что речь не о хаках, а штатных возможностях языка.у перла хаки — штатная возможность же.
такая конструкция в питоне с 2000 года.
Главное достижение - никаких революций, молодцы.И это правильно. Работать надо, а не код из-за версий перелопачивать.
по мне, так из перла уже ничего делать не нужно, т.к. наворочено не просто много, а ооочень много! куда не плюнь, везде его применять можно, хоть веб, хоть сервер дшспи написать.
вот и суют куда барбос свой хер не совал, почем зря
> вот и суют куда барбос свой хер не совал, почем зряЭто вы про shell-скрипты?
Жаль что smartmatch объявили экспериментальным (с выдачей warning при его использовании). Возможность удобная.
> Жаль что smartmatch объявили экспериментальным (с выдачей warning при его использовании).
> Возможность удобная.Ну так присоединитесь к проекту и отладьте ее до стабильного состояния, делов-то.
Он не интерпретатор, а компилятор :)
Сегодня случайно узнал, оказывается есть версия Perl новее 5.16. Обновил до версии perl-5.18.1_1 и модули p5-*, сейчас пересобираются зависимости. В чём преимущества крайней версии, кто-нибудь ощутил?
> Сегодня случайно узнал, оказывается есть версия Perl новее 5.16.brilliant!