arrays - 如何在 Perl 中合并散列?

标签 arrays perl hash reference

我有一个哈希引用数组。哈希值包含 2 个键:USER 和 PAGES。这里的目标是遍历哈希引用数组并保留用户在打印机上打印的页面的运行总数(这来自事件日志)。我从 Excel 电子表格中提取数据,并使用正则表达式提取用户名和页面。电子表格中有 182 行,每行包含一个用户名以及他们在该作业上打印的页数。目前,该脚本可以使用用户名和打印的页数打印每个打印作业(全部 182 个),但我想将其合并,以便它将显示:用户名 266(即仅显示用户名一次,以及打印的总页数)对于整个电子表格。

这是我尝试遍历哈希引用数组,查看用户是否已经存在,如果存在,+=将该用户的页数放入新的哈希引用数组(较小的数组)中。如果没有,则将用户添加到新的哈希引用数组中:

my $criteria = "USER";
my @sorted_users = sort { $a->{$criteria} cmp $b->{$criteria} } @user_array_of_hash_refs;

my @hash_ref_arr;
my $hash_ref = \@hash_ref_arr;

foreach my $index (@sorted_users)
{
    my %hash = (USER=>"",PAGES=>"");
    if(exists $index{$index->{USER}})
    {
        $hash{PAGES}+=$index->{PAGES};
    }
    else
    {
        $hash{USER}=$index->{USER};
        $hash{PAGES}=$index->{PAGES};
    }
    push(@hash_ref_arr,{%hash});
}

但它给了我一个错误:

全局符号“%index”需要位于...的显式包名称

也许我的逻辑在这方面不是最好的。我应该使用数组吗?考虑到我的数据的性质,哈希似乎是最好的东西。我只是不知道如何精简哈希引用数组以获取用户名和它们打印的总页数(我知道我看起来很多余,但我只是想弄清楚)。谢谢。

最佳答案

my %totals;

$totals{$_->{USER}} += $_->{PAGES} for @user_array_of_hash_refs;

然后,获取数据:

print "$_ : $totals{$_}\n" for keys %totals;

您也可以按用途排序:

print "$_ : $totals{$_}\n" for sort { $totals{$a} <=> $totals{$b} } keys %totals;

关于arrays - 如何在 Perl 中合并散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5622476/

相关文章:

java - 如何对给定元素左侧的 N 个数组元素求和?

java - 在java中查找两个集合中的唯一点和公共(public)点,而不使用任何集合、列表等

perl - 打开/操作目录中所有文件的最有效方法是什么?

perl - 如何在 Perl 中检查非空文件

ruby-on-rails - 使用 ruby​​ 将字符串转换为哈希

objective-c - 初始化 'Method *' C 时不兼容的指针类型

ios - 将数组数据模型转换为字典(swift)

perl - 黑白 goto &func; 有什么区别吗?和 &func;在 Perl 中?

GPU 的哈希表实现

php - 如何正确实现 hash_hmac?