如何在 perl 中的数组中存储哈希值



我有一个具有重复值和唯一键的哈希值。我必须将密钥存储在大小为 5 的数组中,如果有更多密钥,则应在其中创建并存储新数组。存储在 1 个数组中的键应具有相同的值。

备注:我必须从excel工作表中读取这些值并生成c源文件。

前任: %hash = (a=>1,b=>2,c=>1,d=>1,e=>3,f=>4,g=>4,h=>1,i=>1,j=>1);

C文件中的输出:

datatype arr1[]={a,c,d,h,i};
datatype arr2[]={j};
datatype arr3[]={b};
datatype arr4[]={e};
datatype arr5[]={f,g};

所以你需要找到具有相同值的键吗?

所以我们需要恢复数组,但处理原始值不是唯一的有点聪明。Som 不只是将"键"=>"值"对转换为"值"=>"键",我们需要将键存储在数组中。

my %hash = ...;
my %transposed;
for my $key (keys %hash) {
    my $value = $hash{$key};
    $transposed{$value} = [] unless defined $transposed{$value};
    push @{ $transposed{$value} }, $key;
}

然后你有一个数组的哈希,其中每个键都是原始哈希中的一个值,数组的元素是键。下一步是遍历键并将每个列表分成 5 个元素的行:

for my $key (sort keys %transposed) {
    while (@{ $transposed{$key} }) {
        my @list = splice @{ $transposed{$key} }, 0, 5;
        say join ", ", @list;
    }
}

主要部分是 while 循环迭代,只要当前列表中有元素,并且每次迭代时拼接就会从列表中删除并返回最多 5 个元素。添加确切的 C 代码留给感兴趣的读者作为练习... :-)

您可能需要阅读参考文献:http://perldoc.perl.org/perlreftut.html

哈希值设置为对空数组的引用的行不是必需的,因为当您尝试将值推送到它时,perl 会自动创建一个 arrayref。我把它包括在内是为了更清楚地说明正在发生的事情。

最新更新