Home

7 Дек, 2009

Perl. Пересекаются ли два массива?

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


На Perl это делается так:
use common::sense;
 
my @a = qw(q w e r t y);
my @b = qw(u i o p q);
 
say 1 if grep { defined } @{{ map { $_ => 1 } @a }}{ @b };

Исходник

Задача решена с помощью анонимного хеша, который строится на лету, и с помощью срезов.
Очень просто, элегантно, без лишних переменных и в одно условие, код написан именно так, как звучит задача. Даа, это красиво :)


UPD: Спасибо [info]what_me за решение на perl 5.10:

use common::sense;
 
my @a = qw(q w e r t y);
my @b = qw(u i o p q);

say @a ~~ {map { $_ => 1 } @b};



ЗЫ: Диалог с сишником++:

– Я не понимаю, зачем нужно учить Perl?
– Давай, я покажу п*здатый код, а ты сам решай. Простая задача – пересекаются ли два списка, ответ да или нет.
(Пошла ржака)
– А массивы одинаковой длины?
(бугага)
– Массивы строк или чисел?
(бугага)
– Вот код (показываю этот код)
– Даа, круто! Что такое map, grep, qw?
(бугага) Смотри задача решена без единой лишней переменной и с помощью анонимного хеша
– Это как лямбда-функция?
(бугага)
– В си тоже есть hashmap
– (бугага) Учи Perl! :)


UPD ЗЫ: Другой сишник мне написал: "и все-таки оно будет работать медленнее чем 2 цикла" (бугага) x 100500


ЗЫЗЫ: RostovOnDon.pm offline #3 permalink.gmane.org/gmane.comp.lang.perl.perl-mongers.rostovondon/343



use Perl or die;

JFDI

10 Ноя, 2009

Perl. Форматирование чисел

Сегодня потребовалось написать функцию по форматированию чисел, приведение к читаемому виду: 1234567 => 1 234 567.
Написал следующую короткую и красивую функцию:
sub D($) {
	for (scalar reverse shift) {
		s/(\d{3})(?=\d)/$1 /g;
		return scalar reverse;
	}
}

say D 12345;
say D 123456;
say D 1234.56;
Спасибо [info]pavel_kudinov за подсказку использовать (?=pattern) positive look-ahead assertion (perlre).
Вместо этого у меня была вторая простая регекспа, которая удаляла лишний символ с конца.

Функция умеет работать и с флоатом, где количество знаков после запятой максимум 3, опять же благодаря (?=\d).

scalar reverse заставляет работать reverse в скалярном котексте при использовании в списковом контексте :)

По-моему, очень красиво получилось )))

Исходник


ЗЫ: С Павлом Кудиновым сошлись на мнении, что наверня-ка на CPAN есть модуль на несколько экранов с похожим функционалом :)


use Perl or die;

JFDI

Метки: , ,

17 Июн, 2008

Perl. Обзор CPAN-модулей

На днях решил написать модуль, который будет анализировать Perl-исходник и показывать зависимости от модулей.
Меня опередили - Module::Used, опубликован 15 июня 2008 :), использует PPI.

Я поклонник pretty code, похоже, что не один - 13 июня 2008 опубликован модуль Pretty, создан для того, чтобы печатать что-нибудь красиво. На данный момент есть возможность печатать таблицы в текстовом виде - Pretty::Table.

Модуль, который рассмешил меня сочетанием названия и зависимостей - Data::SimplePassword, в название сказано - простая генерация паролей, зависимости - CLASS, Class::Accessor, Class::Data::Inheritable, Crypt::Random, Math::Random::MT (or Math::Random::MT::Perl), UNIVERSAL::require :). Оказывается, имеется в виду - протота использования.

И последнее, вчера обновился модуль DBI, изменения не значительные, полный список изменений тут.
Метки: , , , ,

4 Окт, 2007

Точка Кипения. Это не просто слова.

http://www.tochkak.ru/job/
Метки: , , , ,
sharifulin

Декабрь 2009

Вс Пн Вт Ср Чт Пт Сб
  12345
6789101112
13141516171819
20212223242526
2728293031  

Реклама

Метки

Трансляция

RSS Atom
Разработано LiveJournal.com