Довольно спонтанно наваял и зарелизил модуль Array::Utils. Модуль содержит функции, вычисляющие объединение, пересечение и разницу между списками. Ничего нового, но я удивлен, что такого модуля на CPAN еще не было. ( описание под катом )
Да-а, сильный модуль получился, особенно по функционалу - три функции, 107 строк вместе с POD :)
Вообще-то, на CPAN для работы со списка есть линия List, самый популярный модуль List::Util, дополнение к нему List::MoreUtils. В последнем есть uniq. Также есть такой же сильный модуль - List::Uniq и т.д.
На практике я такие вещи делаю руками, из выше перечисленного использую только List::Util.
В твоем модуле явное ограничение - операцию можно проводить только с 2мя списками. Получается результат функции intersect не возможно использовать в другой такой же:
intersect(@c, intersect(@a, @b))
только так:
my @ab = intersect(@a, @b); print intersect(@c, @ab);
Comments 6
Reply
Reply
Reply
Вообще-то, на CPAN для работы со списка есть линия List, самый популярный модуль List::Util, дополнение к нему List::MoreUtils.
В последнем есть uniq. Также есть такой же сильный модуль - List::Uniq и т.д.
На практике я такие вещи делаю руками, из выше перечисленного использую только List::Util.
Reply
Получается результат функции intersect не возможно использовать в другой такой же:
intersect(@c, intersect(@a, @b))
только так:
my @ab = intersect(@a, @b);
print intersect(@c, @ab);
Вместо такой строки:
sub intersect {
my %e; $e{$_}++ foreach map { @$_ } @_;
return sort grep {$e{$_} == @_} keys %e;
}
print intersect(\@a,\@b,\@c,\@d);
# array_diff
sub array_diff {
my %e; $e{$_}++ foreach map { @$_ } @_;
return sort grep {$e{$_} == 1} keys %e;
}
print intersect(\@a,\@b,\@c,\@d);
Reply
There is more than one way to do it.
Reply
Leave a comment