Perl: mehrfach vorkommende Elemente in einer Liste zählen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
zongo
Beiträge: 117
Registriert: 09.04.2007 23:53:46

Perl: mehrfach vorkommende Elemente in einer Liste zählen

Beitrag von zongo » 21.01.2010 16:20:04

Hallo zusammen!

Ich stehe vor einer kleinen Herausforderung und kriege gerade den Dreh nicht so richtig hin ...

Gegeben ist eine sortierte Liste:

aa
aa
aa
bb
cc
cc
cc
dd
dd
ee
ee
ee
ff

Ich will jetzt die Anzahl der gleichen Elemente wissen(in diesem Beispielfall aa=3, bb=1, cc=3, dd=2, ee=3, ff=1). Genauso wie man es mit dem Shell-Kommando "uniq -c" machen könnte, allerdings in Perl.
Und genau hier stehe ich auf dem Schlauch, wie verarbeite ich die Daten und zähle und vergleiche sie dann. Nehme ich ein Array, einen Hash etc. pp.

Für einen gedanklichen Anstoß wäre ich dankbar!

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: Perl: mehrfach vorkommende Elemente in einer Liste zählen

Beitrag von nepos » 21.01.2010 17:24:32

Code: Alles auswählen

#!/usr/bin/perl 

use strict;
use warnings;

my @a = qw(
  aa
  aa
  aa
  bb
  cc
  cc
  cc
  dd
  dd
  ee
  ee
  ee
  ff
);

my %h;
$h{$_}++ foreach (@a);

while (my ($k, $v) = each %h) { 
  print "$k=$v\n";
}
Ausgabe:

Code: Alles auswählen

$ perl test.pl
cc=3
ff=1
bb=1
dd=2
aa=3
ee=3

Benutzeravatar
zongo
Beiträge: 117
Registriert: 09.04.2007 23:53:46

Re: Perl: mehrfach vorkommende Elemente in einer Liste zählen

Beitrag von zongo » 21.01.2010 18:40:33

@nepos: :hail: THX!

Da meine Perl-Kenntnisse inzwischen arg eingerostet sind, muss ich mich mit dem Konstrukt ersteinmal kurz auseinander setzen. Auf die Idee einen Array in einen Hash zählen zu lassen wäre ich so ad hoc nicht gekommen.

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: Perl: mehrfach vorkommende Elemente in einer Liste zählen

Beitrag von nepos » 22.01.2010 08:23:58

Naja, eigentlich ganz einfach: über alle Array-Elemente laufen, das jeweilige Element als Key für den Hash benutzen und den Wert jedesmal um eins erhöhen. Die Ausgabe hätte man auch locker mit foreach schreiben können:

Code: Alles auswählen

foreach my $k (keys %h) {
  print "$k=$h{$k}\n";
}

Antworten