我有一個散列引用數組。哈希包含2個鍵,USER和PAGES。這裏的目標是通過散列引用的數組,並保持用戶打印在打印機上的頁面總數(這來自事件日誌)。我從Excel電子表格中提取數據,並使用正則表達式來提取用戶名和頁面。電子表格中有182行,每行包含一個用戶名和他們在該作業上打印的頁數。目前,腳本可以打印每個打印作業(全部182個),其中包含用戶名和打印的頁面,但我希望將其合併,以便顯示:用戶名266(即僅顯示用戶名一次,以及它們打印的總頁數對於整個電子表格,如何在Perl中整合散列?
這裏是我嘗試通過散列引用數組,看看用戶是否已經存在,如果是這樣,+ =該用戶的頁數爲一個新的散列引用數組(a較小的一個),如果不是,然後將用戶添加到新的哈希值裁判數組:
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」需要明確的包名...
也許我的邏輯不是最好的。我應該使用數組嗎?鑑於我的數據的性質,似乎哈希是最好的東西。我只是不知道如何去減少哈希引用數組來獲取用戶名和他們打印的總頁數(我知道我看起來多餘,但我只是想澄清)。謝謝。
美麗。正是我需要的。非常感謝。每個人真的。所有非常有幫助。對此,我真的非常感激。 – 2011-04-11 14:59:57
您不需要在循環中使用'if'語句。 Perl會自動創建一個條目,如果沒有。另外,如果print打印語句看起來更好:'print Dumper \%totals;' – shawnhcorey 2011-04-11 15:31:52
我不明白爲什麼要對輸入進行排序。我的意思是,當然,你已經從原來的問題中複製了它,但它似乎也沒有意義:-) – 2011-04-11 16:04:17