войти зарегистрироваться

Великий Язык PERL!Мутации объектов в Perl

Зачастую многие объекты, которые инкапсулируют в себе какие-то большие действия, откладывают их исполнение «на потом». А вдруг пользователю объекта это действие не понадобится? В этом случае откладывание действия приведет к экономии ресурсов: не нужно будет выделять память, вычислять итп. Однако в таком случае код методов, которые зависят от того проделана работа или нет начинает пестрить проверками «сделано ли действие?». В Perl есть интересный механизм, который позволяет объектам мутировать в объекты другого класса.

Блог им. grey_kristyФункции по требованию

Знаете ли вы, что в PERL'e можно создавать функции по требованию, на лету?
Что это такое и зачем может понадобится?

Скажем, у вас есть функция html_tag:

sub html_tag {
  my $tag = shift;
  my $msg = shift;  
  return sprintf('<%s>%s</%s>', $tag, $msg, $tag); 
  }



и вы хотите сделать много функций с названиями соответствующих html тегов. Можно, конечно, вручную написать все определения функций:

sub h1 { return html_tag('h1',@_); }
sub h2 { return html_tag('h2',@_); }
sub h3 { return html_tag('h3',@_); }
...



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

Великий Язык PERL!Необычный оператор диапазона

Должен предупредить, что это ещё одна статья, не содержащая никаких откровений. Для тех супер-гиков, которые назубок знают весь perldoc, она будет абсолютно бесполезной, так что, уважаемые супер-гики, можете проходить мимо и не информировать, что всё это есть в доках. Я и так это знаю. :-) Моя статья для всех остальных, для тех, кто весь perldoc целиком либо не осилил, либо осилил, но не понял, либо понял, но не запомнил.

Я думаю, многие знают о так называемом операторе диапазона, записывающемся как .. (две точки), с помощью которого можно быстро создавать массивы из набора последовательных элементов. Например, следующий код создаёт массив из 35 чисел: 3, 4, 5, …, 37:
my @arr = 3 .. 37;
Помимо чисел можно использовать строки: в этом случае для генерации элементов массива будет выполняться так называемый магический инкремент (например, можно задать диапазон букв: 'a' .. 'z').

Однако оператор диапазона может использоваться и в скалярном контексте, принимая в качестве операндов булевские выражения и возвращая булевский результат. И вот здесь начинается самое интересное, потому что это оператор с состоянием: результат операции будет зависеть не только от значений левого и правого операндов, но ещё и от истории вызовов данного выражения!

Великий Язык PERL!Этот загадочный while…

«Все потребности в нем заложены, какие только бывают на свете. И все эти потребности он может удовлетворить. С помощью нашей науки, разумеется.»
А. и Б. Стругацкие


Я думаю, многим из Perl-программистов знакома следующая конструкция построчного чтения содержимого файла:
while (<FILE>) {
    # do something
}
Этот код стал настолько привычным, что многие даже не задумываются, а как же он, собственно, работает. В данной статейке я опишу одну особенность, о которой весьма полезно помнить.

Спортивное программированиеГольф на многих языках. Быть или не быть?

Многие знают, что такое Perl-гольф. Это своеобразная игра, заключающаяся в написании самого краткого кода на Perl, решающего поставленную задачу.
Исторически так сложилось, что гольф закрепился только среди пишущих на Perl. Но, вспомните, сколько раз Вы говорили о коде: «А вот так было бы короче» или «А вот эдак было бы изящнее».
Да, конечно, на других языках это не так гибко и «загадочно», но это тоже интересно, а в случаях с Ruby и Python и очень кратко. По-крайней мере, мы с коллегами после гольфа на Perl не менее интересно посоревновались на этих же задачках и на C, C++ и Ruby.
А как Вы относитесь к гольфу на других языках?

PS. На acm.mipt.ru есть топ по самому краткому коду, но, увы, без разделения на языки.

Великий Язык PERL!Особенности национальных выражений

Захотелось мне поделиться с хабравчанами-перловодами одним интересным случаем, произошедшим у нас на работе. В процессе ревизии старого кода была обнаружена некая загадочная конструкция (здесь и далее реальный код несколько сокращён и приглажен):
sort { my ($x, $y) = ($a, $b); ($x =~ s{/}g) <=> ($y =~ s{/}g); } @array;
Казалось бы, обычная сортировка с переопределённой функцией сравнения. По изначальной задумке автора здесь должна была быть сортировка массива строк по количеству прямых слэшей в этих строках (известно, что выражение замены возвращает в качестве значения количество произведённых замен), однако что-то в этой функции не то. Вроде бы, «заменительная» часть выражения s/pattern/replace/g никогда не была опциональной, однако именно это мы видим в выражениях $a =~ s{/}g. Как же оно работает? Вот с этим мы сейчас и будем разбираться.

Я пиарюсьПозвольте представить — Записки программиста

Интернет-журнал Записки программиста главным образом посвящен таким непростым вещам, как unix-like системам (главным образом — FreeBSD) и программированию на С/C++ и Perl. Тем не менее, я стараюсь время от времени писать посты, рассчитанные на бОльшую целевую аудиторию, потому, надеюсь, блог заинтересует многих.

Чуть подробнее — под катом.

Open sourceOpenSource проект системы GPS мониторинга

Доброе время суток.
Интро.
Последний год-два растет популярность сервисов GPS мониторига подвижных обьектов. В большей степени это конечно мониторинг передвижения транспортых средств, но встречаются и другие применения (наблюдение за перемещением детей, людей, ответственными грузами и даже животных).
Но все эти системы закрыты.

C++Spirit. Спиритические сеансы

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

Недавно вышел Boost 1.41, а с ним и Spirit 2, синтаксический анализатор, почти равный по возможностям оригинальным регулярным выражениям Perl. Я просто обязан о нём написать.

Сегодня мы попытаемся запрограммировать простой интерпретируемый язык.

Великий Язык PERL!Moscow.pm 2009 => 2010

Небольшой рассказ о том, чем Moscow.pm занимался в прошедшем году и о том, чего ждать от 2010-го.

Рассказывает Андрей Шитов.