Есть ли хороший модуль сбора данных в Perl?

StackOverflow https://stackoverflow.com/questions/129740

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Забыл упомянуть: если вы ищете небольшие примеры кода на разных языках, ПРОСЬБА (Примеры языков программирования, похожие на кулинарную книгу) — достойный ресурс.

Другие советы

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

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

В противном случае, пожалуйста, определите более точно, что вы подразумеваете под «вычислением свойства уровня коллекции для каждого элемента».И имейте в виду, что в Perl есть такие ключевые слова, как карта и 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) Следующий блок принимает несколько ссылок на массив и сортирует их: а) прежде всего путем сравнения общего значения в числовом порядке в порядке убывания;б) если значения равны, путем сравнения количества транзакций в числовом порядке в порядке убывания;и в) если это не удается, путем асцибетической сортировки по имени, связанному с этим порядком.

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

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

Обычно я использую @array или %hash.

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

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

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

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

я бы придерживался МАССИВА или ХЕША.

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

и

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

источник

Это зависит от многого;есть Разреженная матрица модули, некоторые формы упорство, а новый стиль ОО и т. д. перлданные, перлол, перлдск чтобы ответить на конкретную проблему с помощью структуры данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top