[perl] power of chaos
От: frogkiller Россия  
Дата: 06.02.09 20:09
Оценка: 8 (1)
Вот уже больше года активно изучаю perl. И чем дальше в лес — тем толще партизаны Я впечатлён обилием синтаксического сахара и невиданным богатством способов прострелить ноги. Оцените код (и это без разнообразных библиотек!):
#!/usr/bin/perl -w

package olap;
use strict;

use overload '%{}' => sub { ${shift()}->[1] },
             '@{}' => sub { ${shift()}->[0] };
sub new {
    my ($p, $a) = (shift, [@_]);

    my %h; tie %h, $p, $a;
    bless \[$a, \%h], $p;
}   

sub add { push @{shift()}, shift }

sub TIEHASH { my $p = shift; bless \shift, $p }
sub FETCH {
    my ($a, $s) = (${shift()}, shift);
    new olap grep { eval $s; } @$a;
}   

1;

package main;
use strict;

my $bar = new olap ([3,4,5,6], [3,4,7,6], [3,9,5,6], [qw(a b c d e)], {a => 5, b => 6, c => 7}, {a => 5, c => 8});

print ${$bar}{'$_->[0] eq 3'}{'$_->[2] eq 5'}[1][1];
print "\n";
print $bar->{'$_->{a} eq 5'}{'!defined($_->{b})'}[0]{c};

1;


Кому непонятно, объясняю — создаётся массив произвольных структур, из которых можно делать любое количество выборок по разным критериям с помощью последовательных {xxx} или же просто обращаться как с обычным массивом. Фишка в том, что здесь не используется постоянный grep {xxx} между выборками — эта функциональность перенесена в перегруженную операцию %{}. Как следствие — естественный (т.е. слева направо) порядок применения фильтров.

Боюсь представить, во сколько строк кода это бы вылилось, если я "с нуля" писал то же самое на своём любимом c++.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.