2011-11-11 99 views
1

您好我是新來的Perl和在初學階段,請幫助 我有一個哈希如何統計重複密鑰並將所有重複密鑰的值添加在一起以創建具有非重複密鑰的新哈希值?

%hash = { a => 2 , b=>6, a=>4, f=>2, b=>1, a=>1} 

我想輸出

  • 一來3次
  • B來到2倍
  • f來過1次

新的散列應該是

%newhash = { a => 7, b=>7,f =>2} 

我該怎麼做?

要計算哈希鍵的頻率,我做

foreach $element(sort keys %hash) { 
    my $count = grep /$element/, sort keys %hash; 
    print "$element comes in $count times \n"; 
} 

但是,這樣做我得到的輸出:

a comes 1 times 
b comes 1 times 
a comes 1 times 
f comes 1 times 
b comes 1 times 
a comes 1 times 

這是不是我想要的。

如何獲得重複鍵的正確頻率數?我如何添加這些重複密鑰的值並存儲在新的散列中?

回答

6

根據定義,一個散列不能有多個相同的散列鍵。你可能想存儲在不同的數據結構中的初始數據,如二維數組:

use strict; 
use warnings; 
use Data::Dumper; 

my @data = ([ a => 2 ], 
      [ b => 6 ], 
      [ a => 4 ], 
      [ f => 2 ], 
      [ b => 1 ], 
      [ a => 1 ], 
      ); 
my %results; 

for my $value (@data) { 
    $results{$value->[0]} += $value->[1]; 
} 

print Dumper %results; 

# $VAR1 = 'a'; 
# $VAR2 = 7; 
# $VAR3 = 'b'; 
# $VAR4 = 7; 
# $VAR5 = 'f'; 
# $VAR6 = 2; 

這就是說,其他事不對人:

%hash = { a => 2 , b=>6, a=>4, f=>2, b=>1, a=>1} 

你不能做到這一點,它將hashref({})分配給一個散列。請使用%hash = (...)$hashref = { ... }

+0

謝謝你這是一個很大的幫助... – ssharma

2

Sonam:

我已重新編輯您的文章以幫助格式化閱讀。研究Markdown Editing Help Guide,這將使您的帖子更清晰,更易於理解。這裏有幾點提示:

  • 縮進你的代碼四個空格。這就告訴Markdown將其放在一邊,不要重新格式化它。
  • 當你做出一個列表時,把astricks放在前面的空格。 Markdown瞭解它是一個項目符號列表並將其格式化。

在原始帖子上按下「編輯」,您可以看到我所做的更改。


現在到您的文章。我不確定我瞭解你的數據。如果你的數據是散列的,這些密鑰將是唯一的。你不能在一個散列中有重複的密鑰,所以你的數據來自哪裏?

例如,如果你從每行兩個數字文件閱讀它,你可以這樣做:

use autodie; 
use strict; 
use warnings; 

open (my $data_fh, "<", "$fileName"); 
my %hash; 
while (my $line = <$data_fh>) { 
    chomp $line; 
    my ($key, $value) = split /\s+/, $line; 
    $hash{$key}++; 
} 
foreach my $key (sort keys %hash) { 
    print "$key appears $hash{$key} times\n"; 
} 

前三行是Perl pragmas。他們改變Perl的運作方式:

  • use autodie:這告訴程序在某些情況下死亡,如當你試圖打開一個不存在的文件。這樣,我不必檢查open聲明是否奏效。
  • use strict:這確保您必須在使用它們之前聲明您的變量,這有助於消除90%的Perl錯誤。您在大多數時間申報變量使用my。聲明爲my的變量最後在聲明的塊中。這就是爲什麼my %hash必須在while塊之前聲明的原因。否則,一旦該循環完成,變量將變爲undefined。
  • use warnings:這在某些情況下會產生Perl警告。例如,您嘗試打印出一個沒有用戶設置值的變量。

第一個循環只是一行一行地通過我的數據並計算您的密鑰出現次數。第二個循環打印結果。

+0

非常感謝你這是一個偉大的幫助 – ssharma