我是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
答案 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