如何在 Perl 中表示集合?

Posted

技术标签:

【中文标题】如何在 Perl 中表示集合?【英文标题】:How can I represent sets in Perl? 【发布时间】:2011-04-11 15:09:57 【问题描述】:

我想用 Perl 表示一个集合。我通常做的是使用带有一些虚拟值的哈希,例如:

my %hash=();
$hash"element1"=1;
$hash"element5"=1;

然后使用if (defined $hash$element_name)判断一个元素是否在集合中。

这是一种常见的做法吗?有什么改进的建议吗?

另外,我应该使用defined 还是exists

谢谢

【问题讨论】:

【参考方案1】:

是的,以这种方式构建哈希集是一种常见的习惯用法。请注意:

my @keys = qw/a b c d/;
my %hash;
@hash@keys = ();

比使用1 作为值更可取,因为undef 占用的空间要少得多。这也迫使您使用exists(无论如何这是正确的选择)。

【讨论】:

+1 谢谢。请参阅有关“深度集”的相关问题:***.com/questions/3700069/…【参考方案2】:

使用 CPAN 上的多个 Set 模块之一。从您的示例来看,Set::LightSet::Scalar 似乎很合适。


我可以用支持 CPAN 的常用论点来捍卫这个建议(忽略可能的协同效应)。

    我们怎么知道现在和将来都需要查找?经验告诉我们even the simplest programs expand and sprawl。使用模块会预料到这一点。 API 对于维护或需要阅读和理解一般代码的人来说比临时实现要好得多,因为它允许考虑不同抽象级别的局部问题。 与此相关,如果结果证明开销是不可取的,那么通过删除间接或对数据结构和源代码进行分析,可以很容易地从模块变为简单模块。但另一方面,如果需要更多功能,则以相反的方式实现要稍微困难一些。 CPAN 模块已经过测试,并且在某种程度上经过彻底调试,也许 API 随着时间的推移也经历了改进步骤,而对于 ad-hoc,programmers usually implement the first design that comes to mind。

很少会发现一开始就选择一个模块是错误的选择。

【讨论】:

除了开销之外,还有什么给你的吗?设置操作还是什么?如果我所做的只是检查集合中是否存在某个项目,我为什么要使用库来做一些语言已经做得非常好的事情? 对支持集合集的模块有什么建议吗? Sets of sets 听起来像是 Set::Object 的工作,它的实例可以嵌套。 为什么要使用库?这样您的代码就可以读取它的功能,而不是它的功能。 $set->insert('foo') 清楚地表明您正在将 'foo' 插入到集合中。 $hashfoo = 1 看起来您正在将 foo 映射到 1,但实际上并非如此。添加到混合成员资格测试,定义和存在的工作同样好,当你开始混合两者时事情会变得混乱。或者当您开始使用 = 0 从集合中删除某些内容,但在某处使用存在检查时。基本上,使用散列作为一个集合很难阅读和维护。哦,是的,Set::Object 比哈希更快。【参考方案3】:

这就是我一直这样做的方式。我倾向于使用exists 而不是defined,但它们都应该在这种情况下工作。

【讨论】:

以上是关于如何在 Perl 中表示集合?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective C 中表示当前的 JSON 模式?

在固定长度向量中表示文档集合的最佳方法是啥?

如何在 proto 文件中表示接口实现

如何在 Python 中表示无限数?

如何在 TypeOrm 中表示视图?

如何在 GADT 中表示此 FSM