Как стать автором
Обновить
0

Perl *

Высокоуровневый интерпретируемый динамический язык

Сначала показывать
Порог рейтинга
Уровень сложности

SWAT — DSL для быстрой разработки автоматических тестов web приложений

Время на прочтение13 мин
Количество просмотров3.3K

Вступление


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

Что, если у нас под сотню различных web приложений, которые необходимо обновить в течение короткого периода времени, а тестов на проверку их работоспособности нет? Разработка UI тестов потребует много времени, а просто сделать запрос curl и проверить что вернулся 200 OK, недостаточно.

Нужен разумный компромисс, простое, но в тоже время достаточное универсальное средство по разработке автоматических тестов. Так на свет появился SWAT.
Читать дальше →
Всего голосов 11: ↑3 и ↓8-5
Комментарии8

Perl5 плагин для IntelliJ IDEA v1.2: Moose и сигнатуры

Время на прочтение2 мин
Количество просмотров3.5K


Выпущена очередная версия Perl5 плагина для IntelliJ IDEA и прочих IDE от JetBrains. Новая версия добавляет поддержку Method::Signature::Simple и Moose.
Читать дальше →
Всего голосов 15: ↑15 и ↓0+15
Комментарии12

Sparrow — perl фреймворк тестирования и мониторинга web приложений

Время на прочтение5 мин
Количество просмотров4.4K

История создания


Sparrow — очень молодой проект. Возник как надстройка над инструментом swat — DSL, написанным на perl для разработки тестовых сценариев различных web приложений. Описание swat — отдельная тема, которую я, возможно, раскрою в следующих публикациях, но, если в двух словах, то swat — это средство для автоматизация web тестирования, базирующееся на использовании утилиты curl и позволяющее создавать произвольные http запросы и валидировать возвращаемый контент.
Читать дальше →
Всего голосов 10: ↑9 и ↓1+8
Комментарии47

Особенности (traits) в Perl 6 – метаданные вместе с символом

Время на прочтение1 мин
Количество просмотров2K
Особенности (Traits) – это удобный и расширяемый способ присоединения метаданных к различным видам объектов в Perl 6. Рассмотрим пример особенности с is cached, автоматически кеширующей возвращаемое функцией значение в зависимости от переданных аргументов.

# следующий код вызывается, когда к функции
# добавляется 'is cached' 
multi sub trait_mod:<is>(Routine $r, :$cached!) {
     my %cache;
     # обернём функцию в блок, который
     $r.wrap(-> $arg {
         # ищет аргумент в кеше
         %cache{$arg}:exists
             ?? %cache{$arg}
             # ... и вызывает оригинал, если он не найден
             !! (%cache{$arg} = callwith($arg))
         }
     );
 }
 
 # пример применения:
 sub fib($x) is cached {
     say("fib($x)");
     $x <= 1 ?? 1 !! fib($x - 1) + fib($x - 2);
 }

 # для всех значений от 0 до 10 происходит лишь по одному вызову
 say fib(10);

Читать дальше →
Всего голосов 11: ↑9 и ↓2+7
Комментарии2

Истории

Поиск с помощью регулярных выражений может быть простым и быстрым

Время на прочтение21 мин
Количество просмотров48K
В этой статье мы рассмотрим два способа поиска с помощью регулярных выражений. Один широко распространён и используется в стандартных интерпретаторах многих языков. Второй мало где применяется, в основном в реализациях awk и grep. Оба подхода сильно различаются по своей производительности:



В первом случае поиск занимает A?nAn времени, во втором — An.

Степени обозначают повторяемость строк, то есть A?3A3 — это то же самое, что и A?A?A?AAA. Графики отражают время, требуемое для поиска через регулярные выражения.

Обратите внимание, что в Perl для поиска строки из 29 символов требуется более 60 секунд. А при втором методе — 20 микросекунд. Это не ошибка. При поиске 29-символьной строки Thompson NFA работает примерно в миллион раз быстрее. Если нужно найти 100-символьную строку, то Thompson NFA справится менее чем за 200 микросекунд, а Perl понадобится более 1015 лет. Причём он взят лишь для примера, во многих других языках наблюдается та же картина — в Python, PHP, Ruby и т. д. Ниже мы рассмотрим этот вопрос более детально.

Наверняка вам трудно поверить приведённым данным. Если вы работали с Perl, то вряд ли подмечали за ним низкую производительность при работе с регулярными выражениями. Дело в том, что в большинстве случаев Perl обращается с ними достаточно быстро. Однако, как следует из графика, можно столкнуться с так называемыми патологическими регулярными выражениями, на которых Perl начинает буксовать. В то же время у Thompson NFA такой проблемы нет.

Возникает логичный вопрос: а почему бы в Perl не использовать метод Thompson NFA? Это возможно и следует делать, и об этом пойдёт далее речь.
Читать дальше →
Всего голосов 85: ↑79 и ↓6+73
Комментарии14

Буферы и двоичный ввод и вывод в Perl6

Время на прочтение2 мин
Количество просмотров4.2K
В Perl 5, начиная с версии 5.8, неплохо реализована поддержка Unicode – но люди всё равно жаловались на сложности в её использовании. В основном из-за того, что программисту нужно отслеживать, какие строчки были декодированы, а какие надо обрабатывать как двоичные данные. И нет надёжного способа посмотреть на переменные и понять, двоичные это строчки или текстовые.

В Perl6 эту проблему решили вводом отдельных типов. В Str хранится текст. Строковые литералы в Perl6 имеют тип Str. Двоичные данные хранятся в объектах Buf. И перепутать их уже нельзя. Конвертация между ними осуществляется при помощи методов encode и decode.

    my $buf = Buf.new(0x6d, 0xc3, 0xb8, 0xc3, 0xbe, 0x0a);
    $*OUT.write($buf);

    my $str = $buf.decode('UTF-8');
    print $str;


У обеих операций эффект одинаковый – они выводят в стандартный выходной поток «møþ» и перевод строки. Buf.new(...) принимает список целых от 0 до 255 – байты из которых и строится новый буфер. $*OUT.write($buf) выводит буфер из $buf в стандартный выходной поток.

$buf.decode('UTF-8') декодирует буфер и возвращает объект Str (или падает, если в буфере не содержится допустимая строка в UTF-8). Обратная операция — $Buf.encode($encoding). Str можно вывести просто через print.
Читать дальше →
Всего голосов 12: ↑11 и ↓1+10
Комментарии0

PG как эволюция Perl для математиков в WeBWorK

Время на прочтение4 мин
Количество просмотров5.1K
Дисклеймер: Представленная информация может быть полезна преподавателям, авторам курсов. Большинство информации является вольным переводом с англоязычной Wiki WeBWorK.

Для начала: Что такое WeBWorK?

WeBWorK — это написанная на Perl свободная система для предоставления индивидуальных домашних заданий через сеть. Система позволяет преподавателям создавать курсы из набора домашних работ, которые могут быть впоследствии решены студентами.

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

Преподаватель также не ограничен в месте доступа. Для составления курса могут быть использованы как новые задачи, так и тысячи уже готовых задач нескольких университетов. Для пресечения списывания предусмотрена возможность задать индивидуальные особенности задания для каждого студента. Вся информация о студентах, курсах и статистика решения задач доступна преподавателю, что позволяет лучше оценить успеваемость студентов, как общую, так и индивидуальную.
Читать дальше →
Всего голосов 13: ↑12 и ↓1+11
Комментарии0

Интервью с Одри Тан, часть 1

Время на прочтение9 мин
Количество просмотров5.9K


Одри Тан в первую очередь известна как создатель и разработчик Pugs, Perl 6 User’s Golfing System, реализации Perl 6 на Haskell, которая появилась 1 февраля 2005 года и была наиболее активно разрабатываемой и наиболее полной реализацией на то время.
Читать интервью
Всего голосов 18: ↑15 и ↓3+12
Комментарии6

Perl5 плагин для IntelliJ IDEA v1.1

Время на прочтение2 мин
Количество просмотров7K


Выпущена новая стабильная версия Perl5 плагина для IntelliJ IDEA и Co. Данный релиз почти целиком посвящен улучшению производительности и качества парсера. Таким образом, больших функциональных изменений с точки зрения IDE нет, однако достижения в указанных областях – значимы.
Читать дальше →
Всего голосов 14: ↑13 и ↓1+12
Комментарии8

Как я мониторил Avito по SMS

Время на прочтение8 мин
Количество просмотров62K
Как известно, на «Авито» периодически появляются товары очень хорошего качества и при этом очень дешевые. Но появляются они редко, висят там мало и исчезают быстро.

Поэтому возникла у меня идея: а не поискать ли сервис, который раз в несколько минут проверяет объявления, и если появилось что-то интересное для меня — оповещает об этом? При этом оповещать лучше всего по смс, а то почту я не всегда проверяю оперативно.

Гуглинг выдал несколько таких сервисов, «всего» от 3 руб за смс или от 4 руб в сутки.

В итоге, я решил написать такой сервис самостоятельно, но об этом дальше…
Читать дальше →
Всего голосов 30: ↑25 и ↓5+20
Комментарии67

Хороший день для кодогенерации

Время на прочтение6 мин
Количество просмотров17K
        Давным-давно, еще на заре существования Вечности, где-то в 300-х Столетиях был изобретен дубликатор массы…
        Вечность приспособила дубликатор для своих нужд. В то время у нас было построено всего шестьсот или семьсот Секторов. Перед нами стояли грандиозные задачи по расширению зоны нашего влияния. «Десять новых Секторов за один биогод» — таков был ведущий лозунг тех лет.
        Дубликатор сделал эти огромные усилия ненужными. Мы построили один Сектор, снабдили его запасами продовольствия, воды, энергии, начинили самой совершенной автоматикой и запустили дубликатор. И вот сейчас мы имеем по Сектору на каждое Столетие.

            Айзек Азимов "Конец Вечности"


То, что день случился не самый лучший, было понятно уже с утра. Ставшая привычной, дождливая серая погода и, похоже, начинавшаяся простуда никак не улучшали настроения. В теле наблюдалась разбитость и, больше всего, хотелось спать. Было совершенно очевидно, что необходимо как-то отвлечься…
Читать дальше →
Всего голосов 20: ↑20 и ↓0+20
Комментарии6

OTRS на прокачку в стиле REG.RU

Время на прочтение19 мин
Количество просмотров31K
image

Наверное, нет необходимости рассказывать, что такое OTRS. Многие компании используют его как средство управления услугами и для осуществления поддержки своих клиентов. История этого проекта берет своё начало аж в 2001 году. И в этом есть свои плюсы и свои минусы. Очень мощный инструмент с огромным количеством функционала практически под любые нужды малого и среднего бизнеса. Причём бесплатно. Платная поддержка только для тех, кому недостаточно базового функционала или нужна помощь в настройке.

Об этом инструменте, который активно используется в нашей компании с 2008 года, и пойдёт речь. А точнее, о том, что с ним стало в руках нетерпеливых Perl-программистов компании REG.RU.
Так что же вы там накодили?
Всего голосов 21: ↑15 и ↓6+9
Комментарии28

.sort'ировка в Perl 6

Время на прочтение4 мин
Количество просмотров10K
Сортировка списков – очень распространённая задача в программировании, и в Perl 6 есть несколько улучшений функции sort, помогающих вам решить такую задачу.

В языке есть обыкновенный типичный sort:

    # сортировка по умолчанию с учётом типа
    my @sorted = @unsorted.sort; # или sort @unsorted;


Как и в Perl 5, можно настраивать функцию для сравнения:

    # численное сравнение
    my @sorted = @unsorted.sort: { $^a <=> $^b };


    # то же, с использованием функциональной семантики
    my @sorted = sort { $^a <=> $^b }, @unsorted;


    # строковое сравнение ( как cmp в Perl 5 )
    my @sorted = @unsorted.sort: { $^a leg $^b };


    # сравнение с учётом типа
    my @sorted = @unsorted.sort: { $^a cmp $^b };


Если записать условие сравнения в скобках, тогда вам не понадобится двоеточие. Это удобно, когда вы хотите выстроить цепочку из других методов, тянущуюся за sort:

    my @topten = @scores.sort( { $^b <=> $^a } ).list.munch(10);

Читать дальше →
Всего голосов 16: ↑16 и ↓0+16
Комментарии2

Ближайшие события

Унификация дизайна со стороны бэкенда: JavaScript на сервере

Время на прочтение8 мин
Количество просмотров16K
image

В начале 2014 года к нам в отдел контентных проектов пришла задача унификации дизайна. Дизайнеры хотели единый стиль проектов и принципы работы интерфейсов. Это будет удобно пользователям, облегчит запуск новых проектов и редизайн существующих (более подробно об этом писал Юра Ветров). Команда фронтенда получит возможность использовать схожие компоненты верстки на разных проектах, что уменьшит время разработки и поддержки существующего функционала. Для команды бэкенда задача оказалась нетривиальной: большинство наших проектов написана на Perl (Template Toolkit), Недвижимость на PHP, Дети и Здоровье используют Django. Но от нас требовалось реализовать не только поддержку единого шаблонизатора, но и согласовать единый формат отдаваемых данных в шаблоны. Обилие подгружаемых AJAX-блочков требовало поддержку еще и клиентской шаблонизации.

Таким образом, задача унификации дизайна превратилась в задачу выбора единого шаблонизатора для Perl, Python, PHP и JS.
Читать дальше →
Всего голосов 31: ↑30 и ↓1+29
Комментарии32

Perl5 плагин для IntelliJ IDEA

Время на прочтение4 мин
Количество просмотров12K
Сегодня вышла первая версия плагина для IntelliJ IDEA – Camelcade. Плагин добавляет поддержку Perl5 в эту чудесную IDE. Плагин бесплатен и опенсорсен. В настоящее время работает в IntelliJ IDEA и специализированных IDE от JetBrains.

image

Подробнее о плагине смотрите под катом.
Читать дальше →
Всего голосов 28: ↑27 и ↓1+26
Комментарии54

Проверяем все страницы сайта в валидаторе html

Время на прочтение3 мин
Количество просмотров18K

Интро


Цель — создать велосипед скрипт, который пробежится по сайту и проверит каждую страницу сайта на валидность html.
Я слышал, что если нападает перфекционизм, то надо полежать, отдохнуть и это пройдет.
Подумаешь, в валидаторе ошибка…
Но если все же не проходит, то
добро пожаловать под кат
Всего голосов 20: ↑18 и ↓2+16
Комментарии7

Meta-Object Protocol в Perl6

Время на прочтение2 мин
Количество просмотров3K
В некоторых языках программирования существует интерфейс для создания класса не через его определение, а через выполнение некоего кода. Этот API называется Meta-Object Protocol или MOP.

В Perl 6 есть MOP, позволяющий создавать классы, роли и грамматики, добавлять методы и атрибуты и делать интроспекцию классов. К примеру, вот как в Rakudo можно использовать вызовы MOP, чтобы узнать, как реализован тип Rat (рациональные числа). Вызовы методов MOP обычно начинаются не с точки, а с .^

 $ perl6
 > say join ', ', Rat.^attributes
 $!numerator, $!denominator
 > # список всех методов слишком длинный,
 > # поэтому мы сделаем случайную их выборку
 > say join ', ', Rat.^methods(:local).pick(5)
 unpolar, ceiling, reals, Str, round
 > say Rat.^methods(:local).grep('log').[0].signature.perl
 :(Numeric $x: Numeric $base = { ... };; *%_)


Большинство строк должны быть понятны: у объектов класса Rat есть два атрибута, $!numerator и $!denominator, и много методов. Метод log принимает значение Numeric как вызывающий метод (это отмечено двоеточием после имени параметра) и необязательный второй параметр $base, у которого есть значение по умолчанию (число Эйлера e).

Хороший пример использования можно взять из интерфейса баз данных Perl 6. У него есть возможность записывать вызовы объекта в log, ограничив при этом запись методов одной конкретной ролью (к примеру, только роли, которая занимается вопросами соединения с базой, или же вопросами извлечения данных). Вот пример:
Читать дальше →
Всего голосов 9: ↑8 и ↓1+7
Комментарии0

Можно ли полагаться на данные, извлекаемые WMI классами?

Время на прочтение3 мин
Количество просмотров10K
На примере нескольких WMI-классов Win32_xxxx, показано, что как минимум некоторые из свойств объектов, возвращаемые указанными классами, совершенно не соответствуют реальным значениям этих свойств.
Читать дальше →
Всего голосов 9: ↑7 и ↓2+5
Комментарии8

Парсим pod от Perl 5 при помощи Perl 6

Время на прочтение7 мин
Количество просмотров1.9K
Только что закончил разработку парсера pod (plain old documentation) для Perl 5, написанного на Perl 6. Грамматику сделать получилось на удивление легко – спасибо Perl 6, ведь я сам-то не особенно какой гений программирования. С помощью ребят из #perl6 я узнал много всего интересного по ходу дела, и хочу поделиться этим со всеми. Ну и код, конечно, тоже прилагается.

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

Разработка грамматики


В Perl 6 грамматика – особый тип классов для разбора текстов. Идея в том, чтобы объявить последовательность регулярок и назначить им токены, которые затем можно использовать для разбора ввода. Для Pod::Perl5::Grammar я подробно проработал спецификацию perlpod, добавляя по мере исследования стандартов нужные токены.

Конечно, есть несколько проблем. Во-первых, как определить регулярку для списков? В pod списки могут содержать списки – может ли определение включать себя? Оказывается, что рекурсивные определения возможны, если только они не совпадают со строкой нулевой длины, что приведёт к бесконечному циклу. Вот определение:

token over_back { <over>
                    [
                      <_item> | <paragraph> | <verbatim_paragraph> | <blank_line> |
                      <_for> | <begin_end> | <pod> | <encoding> | <over_back>
                    ]*
                    <back>
                  }

token over      { ^^\=over [\h+ <[0..9]>+ ]? \n }
token _item     { ^^\=item \h+ <name>
                    [
                        [ \h+ <paragraph>  ]
                      | [ \h* \n <blank_line> <paragraph>? ]
                    ]
                  }
token back      { ^^\=back \h* \n }


Токен over_back описывает весь список с начала до конца. Проще говоря, там написано, что лист должен начинаться с =over и заканчиваться с =back, а посередине может быть много всякого, включая ещё один over_back!

Для простоты я обычно называл токены так, как они пишутся в pod, хотя иногда это не получалось из-за пересечений пространств имён.
Читать дальше →
Всего голосов 9: ↑9 и ↓0+9
Комментарии0

Как сделать грамматику в Perl 6

Время на прочтение3 мин
Количество просмотров5.5K
Грамматика в программировании – это набор правил для разбора текста. Это очень полезная вещь – к примеру, грамматику можно использовать для проверки того, подчиняется ли строка текста конкретным стандартам или нет. У Perl 6 есть встроенная поддержка грамматик. Их настолько просто создавать, что единожды начав, вы обнаружите, что используете их везде.

В последнее время я работал над Module::Minter, простым приложением для создания базовой структуры модуля Perl 6. Мне надо было проверить, что предлагаемое имя модуля соответствует стандартам именования Perl 6.

Имена модулей – это идентификаторы, разделённые двумя двоеточиями. Идентификатор должен начинаться с алфавитного символа (a-z) или подчёркивания, за которым могут идти алфавитно-цифровые символы. Правда, у некоторых модулей может быть только один идентификатор, без двоеточий, а у других их может быть много (HTTP::Server::Async::Plugins::Router::Simple).

Определяем грамматику


В Perl 6 грамматики строятся на регулярках. Мне нужны две: одна для идентификаторов, другая – для разделителей в виде двоеточий. Для идентификаторов я задал:

<[A..Za..z_]> # начинается с буквы или подчёркивания
<[A..Za..z0..9]> ** 0..* # ноль или больше алфавитно-цифровых


Помните, что мы используем регулярки из Perl 6, и тут всё выглядит несколько по-другому. Класс символа определяется <[… ]>, а диапазон определяется оператором… вместо тире. Эта регулярка совпадает с любой первой буквой или подчёркиванием, за которым идёт ноль или более алфавитно-цифровых символов.
Читать дальше →
Всего голосов 11: ↑11 и ↓0+11
Комментарии2

Вклад авторов