User since
2004-06-17
305
Artikel
BenutzerIn
Hi,
ich habe eine Liste z.B. wie folgende:
@Liste = qw( 9 9 9 1 1 2 2 2 2 3 3 3 3 4 4 );
Nun möchte ich die Anzahl der Vorkommen zählen. Die Zahlen kommen immer gruppiert vor! Eine Vermischung der Zahlen (also sowas: 9 5 4 9 4 3) ist nicht möglich.
Als Ergebnis stelle ich mir ein Array of Hashes vor. Die Reihenfolge der Zahlen im Ergebnis soll aber die selbe sein wie in der Ausgangsliste.
@Ergebnis = ( {9=>'3'}, {1=>'2'}, {2=>'4'}, {3=>'4'}, {4=>'2'} );
Wie löst man sowas am geschicktesten?
User since
2003-08-14
2022
Artikel
BenutzerIn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use strict;
use warnings;
use Data::Dumper;
my @list = qw( 9 9 9 1 1 2 2 2 2 3 3 3 3 4 4 );
my %count;
$count{$_}++ for @list;
print Dumper \%count;
my @unique;
$unique[-1] != $_ and push @unique, $_ for @list;
print Dumper \@unique;
my @set = map { { $_ => $count{$_} } } @unique;
print Dumper \@set;
Die Variante von renee mit
Tie::IxHash ist eleganter - außerdem erspart sie dir eine Warnung. Aber so geht es auch zu Fuss.
EDIT: Wobei man die Warnung auch so los wird:
(!$unique[-1] or $unique[-1] != $_) and push @unique, $_ for @list;
\n\n
<!--EDIT|Ronnie|1184573970-->
User since
2004-06-17
305
Artikel
BenutzerIn
Danke Euch beiden - ich habe mich für renee's Lösung entschieden. Funzt auch ...
User since
2004-03-22
5701
Artikel
ModeratorIn + EditorIn
es gibt auch module dafür, mehr dazu in dem artikel den ich grad schreibe :)