Perl:安全地从列表中生成散列,检查重复项
Perl: safely make hash from list, checking for duplicates
在 Perl 中,如果您有一个包含偶数个元素的列表,您可以直接将其转换为散列:
my @a = qw(each peach pear plum);
my %h = @a;
但是,如果有重复的键,那么它们将被静默接受,最后一次出现的是使用的那个。我想进行哈希检查以确保没有重复项:
my @a = qw(a x a y);
my %h = safe_hash_from_list(@a); # prints error: duplicate key 'a'
显然我可以自己编写该例程:
sub safe_hash_from_list {
die 'even sized list needed' if @_ % 2;
my %r;
while (@_) {
my $k = shift;
my $v = shift;
die "duplicate key '$k'" if exists $r{$k};
$r{$k} = $v;
}
return %r;
}
然而,这比简单赋值要慢很多。此外,如果有一个 CPAN 模块已经完成相同的工作,我不想使用我自己的私有例程。
CPAN 上是否有合适的例程来安全地将列表转换为散列?理想情况下,它比上面的纯 Perl 实现快一点(尽管可能永远不会像简单赋值那样快)。
如果允许我提出相关的后续问题,我也想知道绑定哈希 class 它允许每个键只分配一次并在重新分配时死亡。那将是上述问题的更一般情况。同样,我可以自己编写这样一个绑定哈希,但我不想重新发明轮子,如果已经存在的话,我更喜欢优化的实现。
检查键是否重复的快速方法是对键进行计数并确保它们等于列表中项目数的一半:
my @a = ...;
my %h = @a;
if (keys %h == (@a / 2)) {
print "Success!";
}
在 Perl 中,如果您有一个包含偶数个元素的列表,您可以直接将其转换为散列:
my @a = qw(each peach pear plum);
my %h = @a;
但是,如果有重复的键,那么它们将被静默接受,最后一次出现的是使用的那个。我想进行哈希检查以确保没有重复项:
my @a = qw(a x a y);
my %h = safe_hash_from_list(@a); # prints error: duplicate key 'a'
显然我可以自己编写该例程:
sub safe_hash_from_list {
die 'even sized list needed' if @_ % 2;
my %r;
while (@_) {
my $k = shift;
my $v = shift;
die "duplicate key '$k'" if exists $r{$k};
$r{$k} = $v;
}
return %r;
}
然而,这比简单赋值要慢很多。此外,如果有一个 CPAN 模块已经完成相同的工作,我不想使用我自己的私有例程。
CPAN 上是否有合适的例程来安全地将列表转换为散列?理想情况下,它比上面的纯 Perl 实现快一点(尽管可能永远不会像简单赋值那样快)。
如果允许我提出相关的后续问题,我也想知道绑定哈希 class 它允许每个键只分配一次并在重新分配时死亡。那将是上述问题的更一般情况。同样,我可以自己编写这样一个绑定哈希,但我不想重新发明轮子,如果已经存在的话,我更喜欢优化的实现。
检查键是否重复的快速方法是对键进行计数并确保它们等于列表中项目数的一半:
my @a = ...;
my %h = @a;
if (keys %h == (@a / 2)) {
print "Success!";
}