Как я могу вывести уникальные, считать и суммировать с помощью Perl - PullRequest
1 голос
/ 27 октября 2011

Я новичок в 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 ]

2 голосов
/ 27 октября 2011

uniq из List::MoreUtils возвращает уникальные элементы списка:

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

sum из List::Util добавляет элементы списка.

use List::Util 'sum';
my @array = (1,2,3,4,5);
print sum @array;   # 15
1 голос
/ 27 октября 2011

Не уверен, что именно вы хотите, но это нормально?

#!/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 },
)
0 голосов
/ 28 октября 2011

Обычно я не делаю Пишу свою программу бесплатно типа, но поскольку M42 уже сделал большую часть этого, вот это без Data::Dump:

#!/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   

Теперь изучите немного Perl !

0 голосов
/ 27 октября 2011

Re: ответ M42, попробуйте:

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

Или вы можете просто написать:

while (my ($key, $values) = each %h) {
    print "$key $values->{count} $values->{sum}\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...