2015-05-26 30 views

回答

-1

这是一个非常简单的家庭作业的问题(这就是为什么这已经downvoted几次,毫无疑问),但它是,如果你”显示哈希的力量的好方法重新为之奋斗。

让我们来分析一下。您想按第一列对事物进行分类(并计算出现次数),然后对相关数据进行计数。哈希对此非常完美。

让我们假设最终散列将是这个样子:

{ 
    'a' => { 
     '*count' => 3, 
     'x1' => 2, 
     'y1' => 1, 
    }, 
    . . . 
} 

(其中'*count'是不应该出现在你的数据字符串)和你的输出将看起来像你的规范。

解析数据非常简单。

my $hash = {}; 
my $count = '*count'; 
for(@lines) { 
    chomp; 
    my ($x, $y) = split(/\s+/); 
    $hash->{$x}->{$count}++; 
    $hash->{$x}->{$y}++; 
} 

打印出来也很简单:

for my $x (sort keys %{$hash}) { 
    my @output = (sprintf('%s = %d', $x, $hash->{$x}->{$count})); 
    for my $y (qw{ x1 y1 z1 }) { 
     push(@output, sprintf('%s = %d', $y, $hash->{$x}->{$y})); 
    } 
    print join(', ', @output) . "\n"; 
} 

注意,如果说,$hash->{'c'}->{'z1'}不存在,返回仍然是0值。你可以做exists额外检查如果你喜欢,但不应该有必要。

+2

我会亲自避免将计数嵌入到散列中 - 依赖于“从不出现的东西”是糟糕的程序逻辑。为什么不改用subhashes上的'values'? – Sobrique

+0

...或单独的'count_of'散列?这不像你用字节支付。 – Sobrique

相关问题