Thread Innerhalb Hash Def auf Keys zugreifen
(42 answers)
Opened by bianca at 2013-09-08 06:08
Es geht um eine kleine Formularverwaltung. Das heißt, es gibt derzeit 3 Formate (Plain ANSI, Plain UTF und OpenOffice) und ca. 20 Variablen (z.B. Anrede, Anschrift, Telefon usw.)
Im Hash variablen definiere ich alle Variablen. Jede Variable hat einen Hashkey der definiert, für welche Formate diese Variable zur Verfügung steht und einen Hashkey mit dem ich den Code definiere, der den Variableninhalt zurück gibt. Im Hash formate definiere ich die drei Formate jeweils mit Code der im Formular die Variablen einfügt. Das geschieht durch Iteration über den Hashkey der Variablen. Dafür muss ich aber pro Variable erst schauen, ob sie für das aktuelle Format gültig ist. Code (perl): (dl
)
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 #!/usr/bin/perl use strict; use warnings; use diagnostics; my %test; %test = ( variablen => [ { name => 'Var1', gueltig => 'pa', # Gueltigkeit dieser Formularvariable code => sub { 'foo1'; # natürlich wird hier viel viel mehr gemacht }, }, { name => 'Var2', gueltig => 'pu', code => sub { 'foo2'; }, }, { name => 'Var3', gueltig => 'pa,pu', code => sub { 'foo3'; }, }, ], formate => [ { name => 'plain ANSI', ident => 'pa', # konstantes Kürzel zur Identifizierung in der DB code => sub { foreach my $ref (grep {grep {$_ eq 'pa'} split /\,/,$_->{gueltig}} @{$test{variablen}}) { print "pa fuert $ref->{name} aus: ".$ref->{code}()."\n"; } }, }, { name => 'plain UTF', ident => 'pu', code => sub { foreach my $ref (grep {grep {$_ eq 'pu'} split /\,/,$_->{gueltig}} @{$test{variablen}}) { print "pu fuert $ref->{name} aus: ".$ref->{code}()."\n"; } }, }, ], ); foreach my $ref (@{$test{formate}}) { print $ref->{code}()."\n"; } In den beiden Zeilen mit grep würde ich gern auf die Konstanten 'pa' und 'pu' im Stringvergleich verzichten, weil das beim Copy&Paste immer vergessen wird und in diesem Fall nicht sofort auffällt. 10 print "Hallo"
20 goto 10 |