2010-09-13 65 views
28

我想在Perl中表示一个集合。我最常做的用一些虚值的哈希,例如:如何在Perl中表示集合?

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

然后使用if (defined $hash{$element_name})来决定一个元素是否是在集。

这是常见的做法吗?任何改善这个问题的建议?

此外,我应该使用definedexists

谢谢

回答

10

在CPAN上使用众多Set模块之一。从你的例子来看,Set::LightSet::Scalar似乎是合适的。


我能捍卫这个建议与普遍观点亲CPAN(不考虑可能的协同效应)。

  1. 我们怎么能知道查找是现在还是将来所需要的?经验教导,even the simplest programs expand and sprawl。使用模块可以预料到。
  2. 由于API允许考虑不同抽象层次上的部分问题,所以对于维护或者需要阅读和理解代码的人来说,API更适合于临时实现。
  3. 与此相关的是,如果发现开销不理想,则通过去除间接或削减数据结构和源代码很容易从模块转到简单模式。但另一方面,如果需要更多的功能,实现其他方式则更为困难。
  4. CPAN模块已经过测试并在一定程度上彻底调试过,也许API也经历了一段时间的改进步骤,而使用ad-hoc,programmers usually implement the first design that comes to mind

很少事实证明,在开始选择一个模块是错误的选择。

+1

除了开销之外,还有什么东西给你吗?设置操作还是什么?如果我所做的只是检查一个集合中是否存在某个项目,为什么我会使用一个库来执行某种语言已经非常好的语言? – 2010-09-13 11:49:14

+0

关于支持集合集的模块的任何建议? – 2010-09-13 11:52:51

+0

Set的集合听起来像是一个Set :: Object的作业,它的实例可以嵌套。 – daxim 2010-09-13 12:35:23

0

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

38

是的,构建散列集是一种常见的习惯用法。需要注意的是:

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

优选使用1作为值因为undef占用显著更少的空间。这也迫使你使用exists(无论如何这是正确的选择)。

+0

+1谢谢。请参阅有关“深层次”的相关问题:http://stackoverflow.com/questions/3700069/how-to-check-if-a-key-exists-in-a-deep-perl-hash – 2010-09-13 11:54:27

相关问题