Вот уже больше года активно изучаю 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++.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Здравствуйте, frogkiller, Вы писали:
F>Вот уже больше года активно изучаю perl. И чем дальше в лес — тем толще партизаны Я впечатлён обилием синтаксического сахара и невиданным богатством способов прострелить ноги. Оцените код (и это без разнообразных библиотек!):
Это еще что
Just another Perl hacker
Здравствуйте, achmed, Вы писали:
A>Это еще что Just another Perl hacker
Это, да, конечно, но там стреляют в ноги исключительно с целью их прострелить...
Курица — это инструмент, с помощью которого одно яйцо производит другие.