我想在Perl中表示一个集合。我通常使用带有一些虚拟值的哈希表来实现,例如:
my %hash=();
$hash{"element1"}=1;
$hash{"element5"}=1;
使用 if (defined $hash{$element_name})
来判断元素是否在集合中。
这是一种常见的做法吗?有没有改进建议?
此外,我应该使用 defined
还是 exists
?
谢谢
是的,用这种方式构建哈希集是一种常见的习惯用法。请注意:
my @keys = qw/a b c d/;
my %hash;
@hash{@keys} = ();
使用undef
作为值要比使用1
更好,因为undef
占用的空间显著更少。这还强制你使用exists
(这本来就是正确的选择)。
使用CPAN上的众多Set模块之一。从您的示例来看,Set::Light
或Set::Scalar
似乎是合适的选择。
我可以用通常支持使用CPAN的论点来为这个建议辩护(不考虑可能的协同效应)。
很少情况下,在开始选择模块时选择错误。
$set->insert('foo')
明确表示您正在将 'foo' 插入到一个集合中。$hash{foo} = 1
看起来像是将 foo 映射到 1,但实际上并不是这样。加入成员测试的混合使用,其中 defined 和 exists 同样适用,当你开始混合使用两者时,事情可能变得混乱。或者当您开始使用 = 0
来从集合中删除某些内容,但在其他地方使用 exists 检查时。基本上,使用哈希作为集合很难阅读和维护。另外,Set::Object 比哈希更快。 - jrockway这就是我一直以来的做法。我倾向于使用exists
而不是defined
,但在这种情况下它们都应该可以使用。