Readers: 26
1
2
3
4
5
6
7
8
9
10
11
12
Datum Uhrzeit Typ Farbe
2010.09.15 06:01:55 TZ_19_C blau
2010.09.15 06:02:15 FR_90_X schwarz
2010.09.15 06:05:15 TZ_19_C gelb
2010.09.15 06:05:35 TZ_19_B rot
2010.09.15 06:07:22 TZ_19_C blau
2010.09.15 06:07:42 FR_90_X rosa
2010.09.15 06:09:29 TZ_19_B rot
2010.09.15 06:09:49 FR_90_X rosa
2010.09.15 06:11:36 TZ_19_C gelb
2010.09.15 06:11:55 TZ_19_C blau
...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
#!/usr/bin/perl -w use strict ; use warnings ; use Data::Dumper ; my %data = () ; while( my $line = <DATA> ) { if( my ( $model , $color ) = ( $line =~ m/^\d{4}\.\d{2}\.\d{2}\s+\d{2}:\d{2}:\d{2}\s+(\S+)\s+(\S+)/ ) ) { if( ! exists $data{$model} ) { $data{$model} = {} ; } if( ! exists $data{$model}->{$color} ) { $data{$model}->{$color} = 0 ; } $data{$model}->{$color}++ ; } } $Data::Dumper::Indent = 1 ; printf "Data:\n%s\n" , Dumper( \%data ) ; exit ; __DATA__ 2010.09.15 06:01:55 TZ_19_C blau 2010.09.15 06:02:15 FR_90_X schwarz 2010.09.15 06:05:15 TZ_19_C gelb 2010.09.15 06:05:35 TZ_19_B rot 2010.09.15 06:07:22 TZ_19_C blau 2010.09.15 06:07:42 FR_90_X rosa 2010.09.15 06:09:29 TZ_19_B rot 2010.09.15 06:09:49 FR_90_X rosa 2010.09.15 06:11:36 TZ_19_C gelb 2010.09.15 06:11:55 TZ_19_C blau
1 2 3
if( my ( $model , $color ) = ( $line =~ m/^\d{4}\.\d{2}\.\d{2}\s+\d{2}:\d{2}:\d{2}\s+(\S+)\s+(\S+)/ ) ) { $data{$model}->{$color}++ ; }
$data{$model} = {} ;
2010-12-14T18:30:33 la_dy82
$data{$model} = {} ;
2010-12-14T18:43:39 la_dy82Habs rausgefunden:
Code: (dl )$data{$model} = {} ;
Hier erfolgt das Speichern von $model im Hash. :-)
2010-12-14T18:43:39 la_dy82Habs rausgefunden:
Code: (dl )$data{$model} = {} ;
Hier erfolgt das Speichern von $model im Hash. :-)
2010-12-14T18:53:54 clms(Und da vorher geprüft wurde, dass es unter dem Key noch nicht gab, wird das ganze Key-Value-Paar neu angelegt.)
2010-12-14T18:57:08 biancaAus persönlichem Interesse die Frage: Von welcher Programmiersprache kommst Du hier her, clms?
2010-12-14T17:57:11 clmsDie Abfragen if (!exists...) kannst Du weglassen.
genügt.Code (perl): (dl )1 2 3if( my ( $model , $color ) = ( $line =~ m/^\d{4}\.\d{2}\.\d{2}\s+\d{2}:\d{2}:\d{2}\s+(\S+)\s+(\S+)/ ) ) { $data{$model}->{$color}++ ; }
Wenn es die Hash-Einträge $data{$model} und $data{$model}->{$color} noch nicht gibt, legt Perl sie automatisch an.
use strict
2010-12-16T09:22:50 dgwMan kann auchweglassen, dann gibt es sogar für Variablen Autovivication, aber aus genau dem gleichen Grunde warum man das NICHT macht, verwende ich hier diese Testbedingungen.Code (perl): (dl )use strict
In meinen eigenen Skripten traue ich dem Input nicht, und würde vor dem Anlegen eines neuen Key/Value Paares erstmal prüfen, ob $model und $color überhaupt erlaubt sind. Tauchen "verbotene" Werte auf, ist es an dieser Stelle ganz einfach zu sagen, wo der Fehler ("Bad data in inputfile line ...") steckt. Später den Hash zu prüfen ob alle Key/Value Paar überhaupt erlaubt waren ist wenig hilfreich.
2010-12-16T16:12:48 Dubu2010-12-16T09:22:50 dgwMan kann auchweglassen, dann gibt es sogar für Variablen Autovivication, aber aus genau dem gleichen Grunde warum man das NICHT macht, verwende ich hier diese Testbedingungen.Code (perl): (dl )use strict
In meinen eigenen Skripten traue ich dem Input nicht, und würde vor dem Anlegen eines neuen Key/Value Paares erstmal prüfen, ob $model und $color überhaupt erlaubt sind. Tauchen "verbotene" Werte auf, ist es an dieser Stelle ganz einfach zu sagen, wo der Fehler ("Bad data in inputfile line ...") steckt. Später den Hash zu prüfen ob alle Key/Value Paar überhaupt erlaubt waren ist wenig hilfreich.
Klingt erst mal gut, sollte man auch so machen, passt aber nicht zu dem Code, den du gepostet hast. Du prüfst ja gerade nicht, ob gültige Daten eingelesen wurden, sondern legst auf jeden Fall den Key an, wenn er nicht vorhanden ist - egal was in $model oder $color drin steht. Dein Code macht an dieser Stelle keinen Deut mehr, als durch Autovivification gemacht wird.
2010-12-16T09:22:50 dgwMan kann auchweglassen, dann gibt es sogar für Variablen Autovivication, aber aus genau dem gleichen Grunde warum man das NICHT macht, verwende ich hier diese Testbedingungen.Code (perl): (dl )use strict
In meinen eigenen Skripten traue ich dem Input nicht, und würde vor dem Anlegen eines neuen Key/Value Paares erstmal prüfen, ob $model und $color überhaupt erlaubt sind. Tauchen "verbotene" Werte auf, ist es an dieser Stelle ganz einfach zu sagen, wo der Fehler ("Bad data in inputfile line ...") steckt. Später den Hash zu prüfen ob alle Key/Value Paar überhaupt erlaubt waren ist wenig hilfreich.
2010-12-16T17:58:20 clmsHallo Daniel,
wie Dubu schon geschrieben hat - Dein Code testet den Inhalt nicht sondern verschwendet ettliche Zeilen um die ohnehin vorhandene Autovivifikation manuell nachzubauen.
Aber kommen wir zu Deiner Aussage: "Später den Hash zu prüfen ob alle Key/Value Paar überhaupt erlaubt waren ist wenig hilfreich."
Das kann man so auch nicht unkommentiert stehen lassen.
Ich gehöre zu den Leuten, die Input lieber dreimal zu viel als einmal zu wenig überprüfen. Aber ob es wirklich sinnvoll ist, den Inhalt schon hier ausführlich zu checken oder erst später, wenn man die Daten wieder aus dem Hash ausliest (oder garnicht, weil alles gültig ist), hängt von vielen anwendungsspezifischen Faktoren ab, die wir hier nicht kennen:
- wie vertrauenswürdig ist der Input?
- was sind gültige Werte für $model und $color?
-> evtl. alles was die Regex erfüllt.
- Kennt man beim Einlesen überhaupt schon alle Bedingungen für gültige Werte?
-> evtl. will man eine einheitliche Einlese-Routine nutzen,
später ergeben sich aber - aus Zusammenhängen, die der Einleseroutine nicht bekannt sind - Einschränkungen für die gültien Werte.
- was wird mit den Daten nachher angestellt?
-> Sind fehlerbehafte Werte wirklich kritisch oder werden sie später ohnehin bemerkt oder ausgefiltert?
Und wenn ein fehlerhafter Wert erst später, ohne Angabe der Inputzeile gemeldet wird, ist das auch noch kein Problem. Dann macht man halt einen Grep auf den Inputfile. Dauert 2-3 Sekunden länger...
2011-01-10T15:57:30 la_dy82Wie kann man jetzt die Zahlen der Farben bearbeiten?
1
2
3
4
5
6
for my $k1 ( sort keys %$rHoH ) {
print "k1: $k1\n";
for my $k2 ( keys %{$rHoH->{ $k1 }} ) {
print "k2: $k2 $rHoH->{ $k1 }{ $k2 }\n";
}
}
1
2
3
4
5
6
for my $k1 ( sort keys %$rHoH) {
print "\nk1: $k1\n";
for my $k2 ( keys %{$rHoH{ $k1 }} ) {
print "k2: $k2 $rHoH{ $k1 }->{ $k2 }\n";
}
}
2011-01-11T14:38:25 la_dy82Hier gibts kein Button, um ein Screenshot zu posten. :-(
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Data:
$VAR1 = {
'TZ_19_B' => {
'rot' => 2
},
'TZ_19_C' => {
'gelb' => 2,
'blau' => 3
},
'FR_90_X' => {
'rosa' => 2,
'schwarz' => 1
}
};
meins:
k1: TZ_19_B
k2: rot 2
k1: TZ_19_C
k2: gelb 2
k2: blau 3
k1: FR_90_X
k2: rosa 2
k2: schwarz 1