【发布时间】:2011-08-03 02:37:15
【问题描述】:
我有一个哈希引用数组。哈希包含 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”需要显式的包名...
也许我的逻辑不是最好的。我应该改用数组吗?考虑到我的数据的性质,似乎散列是最好的选择。我只是不知道如何将哈希引用数组缩小到只得到一个用户名和他们打印的总页数(我知道我看起来很多余,但我只是想清楚)。谢谢。
【问题讨论】:
标签: arrays perl hash reference