如何使用perl输出唯一,计数和求和

时间:2011-10-27 13:50:04

标签: perl

我是Perl的新手。我需要找到以下数据的唯一,计数和总和。我请求你的帮助。

08/2009   I-111   300
08/2009   I-112   400
08/2009   I-113   500
10/2009   I-200   1000
10/2009   I-300   500
11/2009   I-300   100
11/2009   I-100   400

所以我需要找到这样的

08/2009 3 1200
10/2009 2 1500

4 个答案:

答案 0 :(得分:2)

来自List::MoreUtils

uniq会返回列表中的唯一元素:

use List::MoreUtils 'uniq';
my @x = uniq 1, 1, 2, 2, 3, 5, 3, 4;    # (1,2,3,5,4)

标量上下文中的列表表达式返回元素数。

my @array = (5,6,7,8);
my $a_count = @array;       # 4

my %hash = ('x' => 1, 'y' => 2);
my $h_count = keys %hash;   # 2
来自List::Util

sum添加了列表的元素。

use List::Util 'sum';
my @array = (1,2,3,4,5);
print sum @array;   # 15

答案 1 :(得分:1)

不确定你想要什么,但这样可以吗?

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dump qw(dump);

my %h;
while(<DATA>) {
    chomp;
    my @el = split;
    $h{$el[0]}{count}++;
    $h{$el[0]}{sum} += $el[2];
}
dump%h;

__DATA__
08/2009   I-111   300
08/2009   I-112   400
08/2009   I-113   500
10/2009   I-200   1000
10/2009   I-300   500
11/2009   I-300   100
11/2009   I-100   400

<强>输出:

(
  "08/2009",
  { count => 3, sum => 1200 },
  "11/2009",
  { count => 2, sum => 500 },
  "10/2009",
  { count => 2, sum => 1500 },
)

答案 2 :(得分:0)

回复:M42的答案,试试:

use Data::Dumper;
print Dumper \%h;

或者你可以写:

while (my ($key, $values) = each %h) {
    print "$key $values->{count} $values->{sum}\n";
}

答案 3 :(得分:0)

通常,我不会编写我的程序免费类型的东西,但由于M42已经完成了大部分工作,所以这里没有Data::Dump:< / p>

#!/usr/bin/perl
use strict;
use warnings;

my %h;
while(<DATA>) {
    chomp;
    my @el = split;
    $h{$el[0]}->{count}++;
    $h{$el[0]}->{sum} += $el[2];
}

foreach my $element (sort keys %h) {
    printf "%-10.10s  %-6.6s  %4d\n", $element, 
    $h{$element}->{count}, $h{$element}->{sum};
}
__DATA__
08/2009   I-111   300
08/2009   I-112   400
08/2009   I-113   500
10/2009   I-200   1000
10/2009   I-300   500
11/2009   I-300   100
11/2009   I-100   400   

现在learn yourself some Perl