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

Dav*_*d B 35 perl hash set

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

my %hash=();
$hash{"element1"}=1;
$hash{"element5"}=1;
Run Code Online (Sandbox Code Playgroud)

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

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

另外,我应该使用definedexists

谢谢

Cha*_*ens 48

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

my @keys = qw/a b c d/;
my %hash;
@hash{@keys} = ();
Run Code Online (Sandbox Code Playgroud)

1因为undef占用的空间显着减少,所以优选使用该值.这也迫使你使用exists(无论如何这是正确的选择).


dax*_*xim 14

使用CPAN上的众多Set模块之一.从你的例子来看,Set::Light或者Set::Scalar看起来合适.


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

  1. 我们怎么知道现在和将来都需要查找所有内容?经验教导即使是最简单的程序也会扩展和扩展.使用模块可以预见到这一点.
  2. 对于维护,或者需要一般性地阅读和理解代码的人来说,API比临时实现更好,因为它允许考虑不同抽象级别的部分问题.
  3. 与此相关,如果事实证明开销是不合需要的,则通过删除间接或削减数据结构和源代码,很容易从模块变为简单模块.但另一方面,如果一个人需要更多的功能,那么实现相反的方式要困难得多.
  4. CPAN模块已经过测试,并且在某种程度上已经过彻底调试,也许API也经历了一段时间内的改进步骤,而对于ad-hoc,程序员通常会实现第一个想到的设计.

很少有人认为在开始时选择一个模块是错误的选择.

  • 为什么要使用图书馆?这样你的代码可以读取它的内容,而不是它是如何实现的.`$ set-> insert('foo')`清楚地表明你正在将'foo'插入一个集合中.`$ hash {foo} = 1`看起来就像你将foo映射到1,你不是.添加到混合成员资格测试中,已定义和存在的工作同样适用,当您开始混合两者时,事情会变得混乱.或者当你开始使用= 0从集合中删除某些东西,但是在某处使用存在的检查.基本上,使用散列作为集合很难阅读并且难以维护.哦,是的,Set :: Object比哈希更快. (5认同)
  • 除了开销之外,还有什么给你的吗?设置操作什么的?如果我所做的只是检查集合中某个项目的存在,为什么我要使用库来做一些该语言已经做得非常好的事情? (2认同)