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

时间:2016-03-03 12:23:27

标签: perl hash

我有一个具有重复值和唯一键的哈希。我必须将键存储在大小为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};

1 个答案:

答案 0 :(得分:0)

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

所以我们需要恢复数组,但处理原始值不是唯一的有点聪明。 Som而不仅仅是转换'key'=> 'value'对'value'=> 'key',我们需要将密钥存储在数组中。

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循环迭代,只要当前列表中有元素,并且splice每次迭代都会从列表中删除并返回最多5个元素。添加确切的C代码留给感兴趣的读者练习......: - )

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

不需要将哈希值设置为对空数组的引用的行,因为当您尝试将值推送到它时,perl将自动创建一个arrayref。我已将其包含在内,以便更清楚地了解正在发生的事情。