Perl:使重复哈希键的声明成为 fatal error ?

标签 perl hash

Perl 中有没有办法在声明时使重复哈希键的存在成为错误?
例如,对于这样的脚本:
测试.pl

#!/usr/bin/perl

my %hash = (
             'a' => 'valid',
             'b' => 'valid',
             'c' => 'valid',
             'a' => 'duplicate'
           );
我想在运行时看到这样的东西:
$ perl ./test.pl
duplicate hash key at ./test.pl line 7, near 'a' => 'duplicate'
Execution of ./test.pl aborted due to compilation errors.
理想情况下,我希望保持哈希声明语法相同。有什么办法可以做到这一点吗?

最佳答案

tied hash ,您可以覆盖存储哈希值的机制。

package Hash::DupesNotAllowed;
use Carp;
sub TIEHASH  { bless {}, $_[0] }  # borrowed from  Tie::StdHash
sub FETCH    { $_[0]->{$_[1]} }
sub FIRSTKEY { my $a = scalar keys %{$_[0]}; each %{$_[0]} }
sub NEXTKEY  { each %{$_[0]} }
sub EXISTS   { exists $_[0]->{$_[1]} }
sub DELETE   { delete $_[0]->{$_[1]} }
sub CLEAR    { %{$_[0]} = () }
sub SCALAR   { scalar %{$_[0]} }

sub STORE {
    my ($self,$key,$value) = @_;
    if (exists($self->{$key})) {
        croak "Duplicate key '$key'";
    }
    $self->{$key} = $value;
    return;
}
1;


package main;
use Hash::DupesNotAllowed;
my (%h1, %h2, %h3);
tie %h2, 'Hash::DupesNotAllowed';
tie %h3, 'Hash::DupesNotAllowed';

%h1 = (a => 'one', b => 'two', a => 'three');    # ok
%h2 = (a => 'one', b => 'two', c => 'three');    # ok
%h3 = (a => 'one', b => 'two', a => 'three');    # "Duplicate key"

关于Perl:使重复哈希键的声明成为 fatal error ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67145215/

相关文章:

perl - 在perl中读取msi文件

perl - 使用 Perl 从文本中提取多个项目

arrays - 创建根据另一个变量的内容命名的 Perl 哈希值

hash - 为什么java hashCode()中经常使用XOR,而其他按位运算符却很少使用?

algorithm - 需要一个函数从较大的哈希创建较小的哈希

hash - Clojure映射限制和一致性

Perl:将哈希数组转换为矩阵

Perl - 无法为子类创建类变量

algorithm - 将距离设置为 MinHashing 算法的相似性度量

java - 需要帮助理解 Rabin-Karp 实现中恒定时间内的滚动哈希计算