Любой хороший модуль коллекции в Perl? - PullRequest
2 голосов
/ 25 сентября 2008

Может кто-нибудь предложить хороший модуль в Perl, который можно использовать для хранения коллекции объектов?

Или ARRAY - достаточно хорошая замена для большинства потребностей?

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

Поскольку мне нужно выполнить много таких операций, я мог бы также написать класс, который может быть расширен отдельными объектами. Этот класс, очевидно, будет работать с массивами (или может быть хешами).

Ответы [ 8 ]

4 голосов
/ 25 сентября 2008

Существуют модули коллекции для более сложных структур, но в Perl принято использовать массивы для массивов, стеков и списков. Perl имеет встроенные функции для использования массива в качестве стека или списка: push / pop, shift / unshift, splice (вставка или удаление в середине) и форма foreach для итерации.

Perl также имеет карту, называемую hashmap, которая является эквивалентом словаря в Python - позволяющую вам иметь связь между одним ключом и одним значением.

Разработчики Perl часто сочиняют эти две структуры данных, чтобы построить то, что им нужно - нужно несколько значений? Храните ссылки на массивы в части значения хеш-таблицы (Map). Деревья могут быть построены аналогичным образом - если вам нужны уникальные ключи, используйте многоуровневые хэш-карты или если вы не используете ссылки на вложенные массивы.

Эти два примитивных типа коллекций в Perl не имеют объектно-ориентированного API, но они все еще являются коллекциями.

Если вы посмотрите на CPAN, вы, вероятно, найдете модули, которые предоставляют другие объектно-ориентированные структуры данных, это действительно зависит от ваших потребностей. Есть ли какая-то конкретная структура данных, которая вам нужна, кроме List, Stack или Map? Вы можете получить более точный ответ (например, конкретный модуль), если вы спрашиваете о конкретной структуре данных.

Забыл упомянуть, если вы ищете небольшие примеры кода на разных языках, PLEAC (Примеры языков программирования, как Поваренная книга), является достойным ресурсом.

3 голосов
/ 25 сентября 2008

Второй комментарий Майкла Кармана: пожалуйста, не используйте термин «Hashmap» или «map», когда вы имеете в виду хэш или ассоциативный массив. Особенно, когда в Perl есть функция map; это просто смущает вещи.

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

В противном случае, пожалуйста, определите более точно, что вы подразумеваете под "вычислять свойство уровня коллекции для каждого элемента". И имейте в виду, что в Perl есть такие ключевые слова, как map и grep, которые позволяют вам выполнять функциональные задачи программирования, например,

my $record = get_complex_structure();
# $record = {
#    'widgets' => {
#        name => 'ACME Widgets',
#        skus => [ 'WIDG01', 'WIDG02', 'WIDG03' ],
#        sales => {
#            WIDG01 => { num => 25, value => 105.24 },
#            WIDG02 => { num => 10, value => 80.02 },
#            WIDG03 => { num => 8,  value => 205.80 },
#        },
#    },
#    ### and so on for 'grommets', 'nuts', 'bolts' etc.
# }

my @standouts =
    map { $_->[0] }
    sort {
        $b->[2] <=> $a->[2] 
     || $b->[1] <=> $a->[1]
     || $record->{$a->[0]}->{name} cmp $record->{$b->[0]}->{name}
    }
    map {
        my ($num, $value);
        for my $sku (@{$record->{$_}{skus}}) {
            $num   += $record->{$_}{sales}{$sku}{num};
            $value += $record->{$_}{sales}{$sku}{value};
        }
        [ $_, $num, $value ];
    }
    keys %$record;

Считывание задом наперед, это конкретное преобразование Шварцциана делает три вещи:

3) Он берет ключ к $ record, просматривает SKU, определенные в этой произвольной структуре, и определяет общее количество и общую стоимость транзакций. Возвращает анонимный массив, содержащий ключ, количество транзакций и общее значение.

2) Следующий блок получает несколько массивов и сортирует их a) в первую очередь путем сравнения общего значения численно в порядке убывания; б) если значения равны, сравнивая количество транзакций, численно в порядке убывания; и c) если это не удастся, путем сортировки асибетически по имени, связанному с этим порядком.

1) Наконец, мы берем ключ к $ record из отсортированной структуры данных и возвращаем его.

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

2 голосов
/ 25 сентября 2008

Я бы обычно использовал хэш @array или%.

Какие функции вы ищете, которые не предоставляются этими?

1 голос
/ 25 сентября 2008

Поскольку массивы Perl можно легко добавлять, изменять их размер, сортировать и т. Д., Они достаточно хороши для большинства «коллекционных» нужд. В случаях, когда вам нужно что-то более продвинутое, обычно подойдет хеш. Я бы не советовал вам искать модуль сбора, пока вам действительно не понадобится его.

1 голос
/ 25 сентября 2008

Примите решение о том, как вам нужен доступ к объектам. Если толкание их в массив, индексация, выталкивание / смещение их работает, то используйте массив. В противном случае хешируйте их по некоторому ключу или организуйте их в дерево объектов, которое соответствует вашим потребностям Хэш объектов - это очень простой, мощный и высоко оптимизированный способ работы в Perl.

0 голосов
/ 25 сентября 2008

Многое зависит; есть Разреженная матрица модули, некоторые формы постоянство , новый стиль OO и т. д. Большинство людей просто набирают perldata , perllol , perldsc , чтобы ответить на их конкретную проблему со структурой данных.

0 голосов
/ 25 сентября 2008

В массиве или хэше может храниться коллекция объектов. Класс может быть лучше, если вы хотите работать с ним определенным образом, но вам нужно будет рассказать нам, каковы эти способы, прежде чем мы сможем дать какие-либо хорошие рекомендации.

0 голосов
/ 25 сентября 2008

Я бы придерживался Массива или Хэша

 @names = ('Paul','Michael','Jessica','Megan');

и

my %petsounds = ("cat" => "meow",
             "dog" => "woof",
             "snake" => "hiss");

источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...