Perl中有任何好的收集模块吗?
有人可以在perl中提出一个好的模块来存储对象集合吗?
还是ARRAY足以替代大多数需求?
更新:
我正在寻找一个collections类,因为我希望能够进行每个元素的操作,例如compute collection level属性。
由于我需要执行许多此类操作,因此我不妨编写一个可由单个对象扩展的类。此类显然适用于数组(或者可能是哈希)。
解决方案
我会坚持使用阵列或者哈希。
@names = ('Paul','Michael','Jessica','Megan');
和
my %petsounds = ("cat" => "meow", "dog" => "woof", "snake" => "hiss");
来源
根据我们需要如何访问对象的决定。如果将它们推入数组中,则对其进行索引,弹出/移出它们是可行的,然后使用数组。否则,可以通过某些键将其散列,或者将它们组织成满足我们需要的对象树。在Perl中,对象散列是一种非常简单,功能强大且经过高度优化的处理方式。
我通常会使用@array或者%hash。
我们要寻找的功能不是这些功能所不能提供的?
由于Perl数组可以轻松地添加,调整大小,排序等,因此它们足以满足大多数"集合"需求。如果我们需要更高级的功能,通常会使用哈希。我不建议我们在真正需要它之前就去寻找一个收集模块。
数组或者哈希可以存储对象的集合。如果我们想以某种方式与班级合作,那么一堂课可能会更好,但是在我们提出任何好的建议之前,我们必须告诉我们这些方式是什么。
有一些用于更复杂结构的收集模块,但是Perl中的常见样式是将Arrays用于数组,堆栈和列表。 Perl内置了将数组用作堆栈或者列表的函数:push / pop,shift / unshift,splice(在中间插入或者删除)和foreach迭代形式。
Perl还具有一个称为hashmap的映射,该映射与Python中的Dictionary等效,从而使我们可以在单个键和单个值之间建立关联。
Perl开发人员经常将这两个数据结构组合起来,以构建所需的多个值?将数组引用存储在哈希表(映射)的值部分中。如果需要唯一键,使用多层哈希表或者不使用嵌套数组引用,则可以类似的方式构建树。
Perl中的这两种原始集合类型没有面向对象的api,但它们仍然是集合。
如果我们查看CPAN,则可能会找到提供其他面向对象数据结构的模块,这实际上取决于需求。除了列表,堆栈或者映射之外,是否还需要特定的数据结构?如果我们要询问特定的数据结构,则可能会得到更精确的答案(例如,特定的模块)。
忘了提一下,如果我们正在寻找各种语言的小型代码示例,那么PLEAC(类似于Cookbook的编程语言示例)就是不错的资源。
这取决于很多;有稀疏矩阵模块,某种形式的持久性,一种新的OO等
大多数人只是使用perldata,perllol,perldsc来回答有关数据结构的特定问题。
我将第二次推荐迈克尔·卡曼(Michael Carman)的意见:当我们表示哈希或者关联数组时,请不要使用术语"哈希映射"或者"映射"。特别是当Perl具有地图功能时;那只会使事情变得混乱。
话虽这么说,凯尔·伯顿的回应从根本上说是合理的:通常是散列或者数组,或者是由两者混合而成的复杂结构。 Perl抱怨OO,但不强制执行;松散定义的数据结构可能足以满足需求。
如果失败,请更精确地定义"从每个元素计算集合级别属性"的含义。请记住,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;
从背面读到前面,这个特定的Schwarztian转换完成了三件事:
3)它需要$ record的键,经过此任意结构中定义的SKU,然后得出交易的总数和总价值。它返回一个包含键,事务数和总值的匿名数组。
2)下一个块接收多个arrayref并对其进行排序a)首先,通过按降序对数字的总值进行数值比较; b)如果值相等,则通过比较交易次数以降序从数字上进行; c)如果失败,则按照与该订单相关的名称进行排序。
1)最后,我们从排序后的数据结构中获取$ record的键,并将其返回。
很有可能我们不需要设置单独的类即可执行所需的操作。