我怎样才能在Perl中表示集合?

时间:2010-09-13 11:39:47

标签: perl hash set

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

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

然后使用if (defined $hash{$element_name})来确定元素是否在集合中。

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

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

谢谢

3 个答案:

答案 0 :(得分:45)

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

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

最好使用1作为值,因为undef占用的空间要少得多。这也迫使你使用exists(无论如何都是正确的选择)。

答案 1 :(得分:13)

在CPAN上使用众多Set模块之一。从您的示例来看,Set::LightSet::Scalar似乎是恰当的。


我可以用CPAN的常规论据来辩护这个建议(无视可能的协同效应)。

  1. 我们怎么知道现在和将来都需要查找所有内容?经验教导even the simplest programs expand and sprawl。使用模块可以预期。
  2. API可以更好地进行维护,或者需要阅读和理解一般代码的人,而不是临时实现,因为它允许考虑不同抽象级别的部分问题。
  3. 与此相关,如果结果是不希望的开销,则通过删除间接或削减数据结构和源代码,很容易从模块转变为简单。但另一方面,如果一个人需要更多的功能,那么实现相反的方式会更加困难。
  4. CPAN模块已经过测试,并且在某种程度上已经过彻底调试,也许API在整个过程中都经历了改进步骤,而使用ad-hoc,programmers usually implement the first design that comes to mind
  5. 很少会发现在开始时选择模块是错误的选择。

答案 2 :(得分:1)

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