1 2 3 4 5 6 7 8 9
#!/usr/bin/perl use strict; use warnings; use diagnostics; my %test = ( foo => 'bar', test => $test{foo}, ); print "'$test{test}'\n";
QuoteGlobal symbol "%test" requires explicit package name at test.pl line 7.
Execution of test.pl aborted due to compilation errors (#1)
(F) You've said "use strict" or "use strict vars", which indicates
that all variables must either be lexically scoped (using "my" or "state"),
declared beforehand using "our", or explicitly qualified to say
which package the global variable is in (using "::").
Uncaught exception from user code:
Global symbol "%test" requires explicit package name at test.pl line 7.
Execution of test.pl aborted due to compilation errors.
at test.pl line 9.
1 2 3 4 5 6 7 8 9 10
#!/usr/bin/perl use strict; use warnings; use diagnostics; my %test = (); %test = ( foo => 'bar', test => $test{foo}, ); print "'$test{test}'\n";
1 2 3 4 5 6 7 8 9 10
#!/usr/bin/perl use strict; use warnings; use diagnostics; my %test = (); %test = ( foo => 'bar', test => 'bar', ); print "'$test{test}'\n";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#!/usr/bin/perl use strict; use warnings; my %test = (); $test{foo} = \do{my $bar = 'bar'; }; $test{test} = $test{foo}; print ${$test{test}},"\n"; print ${$test{foo}},"\n"; ${$test{foo}} = 'foobar'; print ${$test{test}},"\n"; print ${$test{foo}},"\n";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#!/usr/bin/perl use strict; use warnings; use diagnostics; my %test; %test = ( array => [ { foo => 'bar', code => sub { my ($ref) = @_; 'ja' if $ref eq $test{array}[0]{foo}; }, } ], ); print "'".$test{array}[0]{code}('bar')."'\n";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#!/usr/bin/perl use strict; use warnings; my %test; %test = ( foo => { foo => 'bar', code => sub { my ($ref) = @_; 'ja' if $ref eq $test{foo}{foo}; } } ); print &{$test{foo}{code}}('bar'),"\n";
2013-09-08T07:47:40 frankessorry, brauche ein wenig um zu verstehen, was das Ziel.
2013-09-08T07:47:40 frankesAber vielleicht ist ein hashref eine gangbare Lösung.
2013-09-08T07:51:32 bianca2013-09-08T07:47:40 frankessorry, brauche ein wenig um zu verstehen, was das Ziel.
Das Ziel ist eine Variablendefinition am Anfang meines Scripts wo jeder Wert auf jeden Fall nur 1 x vorkommt, damit es einfach zu pflegen ist.
2013-09-08T07:47:40 frankesAber vielleicht ist ein hashref eine gangbare Lösung.
Ich finde in diesem Beispiel meine Array Definition nicht wieder. Wo ist die geblieben?
In meinem Beispiel war es nur ein Eintrag im Array, im Script sind es natürlich zig Einträge.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#!/usr/bin/perl use strict; use warnings; my %test; %test = ( array => { foo => { foo => 'bar', code => sub { my ($ref) = @_; 'ja' if $ref eq $test{foo}{foo}; } } } ); print &{$test{array}{foo}{code}}('bar'),"\n";
2013-09-08T08:22:54 frankesWie gesagt fällt es mir nicht ganz leicht, zu verstehen was das Ziel ist.
QuoteDu hast im neuen Code wieder kein Array benutzt. Ein Array beginnt mit [ und endet mit ]. Bitte schau nochmal mein Beispiel an.
QuoteEs soll eine unsortiere frei bewegliche Liste mit Definitionen sein.
Und im Key "code" möchte ich innerhalb des selben Array auf anderen Hashkeys zugreifen können, ohne den Array-Index nutzen zu müssen. Denn sonst kann ich die Reihenfolge nicht mehr ändern.
Also wie eine Art "this" aus Javascript.
2013-09-08T08:49:11 frankesIch glaube was du möchtest ist OOP.
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
#!/usr/bin/perl use strict; use warnings; # Anfangswert setzen my $fct = foo->new('bar'); # Ausgabe print $fct->is_equal('bar'),"\n"; # Wert ändern $fct->set('foobar'); # Ausgabe print $fct->is_equal('bar'),"\n"; 1; # Funktion { package foo; sub new { my $class = shift; my $foo = shift; bless \$foo, $class; } sub is_equal { my $class = shift; my $bar = shift; return 'kein Vergleich möglich' if !$$class; $bar eq $$class ? 'ja':'nein'; } sub set { my $class = shift; $$class = shift; } 1; }
2013-09-08T06:30:51 biancaWie greife ich in Zeile 12 variabel auf den Key foo zu, ohne [0] angeben zu müssen? Also quasi wie eine Art this?
$test{array}[0]{foo} möchte ich nicht schreiben, damit die Reihenfolge im Array egal bleibt und 'bar' möchte ich nicht schreiben, damit ich den Wert von foo nur an einer Stelle änderen brauche, falls er geändert werden muss.
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"; }
2013-09-08T16:48:57 MuffiMhm. ok
2013-09-08T16:48:57 MuffiAber was hat das encoding damit zu tun, obes einen Vornamen gibt?
1 2 3 4 5 6 7 8 9
formate => { pa => { name => 'plain ANSI', variablen => [ 'Var1', 'Var3' ], }, pu => { ... } }
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
#!/usr/bin/perl use strict; use warnings; use diagnostics; my %test = ( formate => { 'plain ANSI', => [qw(Var1 Var3)], 'plain UTF' => [qw(Var2 Var3)] }, variablen => { 'Var1' => sub { 'foo1'; # natürlich wird hier viel viel mehr gemacht }, 'Var2' => sub { 'foo2'; }, 'Var3' => sub { 'foo3'; } } ); for my $format (sort keys %{$test{formate}}) { for my $var (@{$test{formate}->{$format}}) { print "$format fuehrt $var aus: ". $test{variablen}->{$var}()."\n"; } }
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
#!/usr/bin/perl use strict; use warnings; use diagnostics; my %test = ( formate => { 'pa' => 'plain ANSI', 'pu' => 'plain UTF' }, variablen => { 'Var1' => { formate => { 'pa' => 1, 'pu' => 0 }, code => sub { 'foo1'; # natürlich wird hier viel viel mehr gemacht }, }, 'Var2' => { formate => { 'pa' => 0, 'pu' => 1 }, code => sub { 'foo2'; }, }, 'Var3' => { formate => { 'pa' => 1, 'pu' => 1 }, code => sub { 'foo3'; }, } } ); for my $format (sort keys %{$test{formate}}) { for my $var (sort keys %{$test{variablen}}) { print "$format fuehrt $var aus: " . $test{variablen}->{$var}->{code}() . "\n" if $test{variablen}->{$var}->{formate}->{$format}; } }
2013-09-09T07:44:23 MuffiWas an:
STRG+C Variablenname, Scroll nach Formular1 => STRG+V, Scroll nach Formular2 => STRG+V, ...
komplizierter sein soll als an:
2013-09-09T07:44:23 MuffiAnsonsten, lager halt das Code einfach in eine Funktion und übergib ihm "ident". Das spart dir zusätzlich zig mal den gleichen Code dastehn zu haben.
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 54 55
#!/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 { my ($ident) = @_; foreach my $ref (grep {grep {$_ eq $ident} split /\,/,$_->{gueltig}} @{$test{variablen}}) { print "$ident fuert $ref->{name} aus: ".$ref->{code}()."\n"; } }, }, { name => 'plain UTF', ident => 'pu', code => sub { my ($ident) = @_; foreach my $ref (grep {grep {$_ eq $ident} split /\,/,$_->{gueltig}} @{$test{variablen}}) { print "$ident fuert $ref->{name} aus: ".$ref->{code}()."\n"; } }, }, ], ); foreach my $ref (@{$test{formate}}) { print $ref->{code}($ref->{ident})."\n"; }
2013-09-09T11:04:30 payxmir scheint das immer noch zu komplex (und irgendwie fehleranfällig) gelöst zu sein.
2013-09-09T11:04:30 payxWas die Script-Pflege betrifft, ist doch mein zweiter Ansatz von oben nicht aufwendiger als dieser?
2013-09-09T11:04:30 payxund die Verknüpfung zwischen beiden muss in der Art eines Mappings gepflegt werden.
2013-09-09T11:04:30 payxDabei ist es technisch gesehen egal, ob ich den Formaten eine Liste mit Variablen (mein erster Ansatz) oder den Variablen eine Liste mit Formaten (mein zweiter Ansatz) beifüge.
2013-09-09T11:04:30 payx[*]Das eigene [c]code[/c]-Element bei den Formaten scheint mir überflüssig zu sein.
2013-09-09T11:04:30 payx[*]Die beiden [c]print[/c]-Befehle aus [c]$test{formate}->{code}[/c] und unten der [c]foreach[/c]-Schleife werden hier irgendwie verschachtelt (wundert mich fast, dass das funktioniert): Das aus der [c]foreach[/c]-Schleife unten kannst Du einfach weglassen: [c]$ref->{code}($ref->{ident});[/c] statt [c]print $ref->{code}($ref->{ident})."\n";[/c]. (Notfalls nochmals [c]print "\n";[/c] am Ende.)[*]Auch die Verschachtelung der beiden [c]foreach[/c]-Schleifen kommt mir unnötig kompliziert vor.[/list]
2013-09-09T11:04:30 payxZumindest für die hier erkennbare Aufgabenstellung scheint mir mein Ansatz, ehrlich gesagt, viel besser (weil viel einfacher) strukturiert zu sein.
2013-09-09T14:56:38 bianca2013-09-09T11:04:30 payxmir scheint das immer noch zu komplex (und irgendwie fehleranfällig) gelöst zu sein.
Was siehst du fehleranfällig an?
2013-09-09T14:56:38 bianca2013-09-09T11:04:30 payxund die Verknüpfung zwischen beiden muss in der Art eines Mappings gepflegt werden.
Nein, wofür?
2013-09-09T11:04:30 payxDa zwischen Formaten und Variablen eine n:n-Beziehung besteht, müssen beide Bereiche auf jeden Fall separat existieren ...
2013-09-09T14:56:38 bianca2013-09-09T11:04:30 payxDabei ist es technisch gesehen egal, ob ich den Formaten eine Liste mit Variablen (mein erster Ansatz) oder den Variablen eine Liste mit Formaten (mein zweiter Ansatz) beifüge.
Nein. Ich brauche ja nur von den Variablen ausgehend deren "Aussage" für welche Formate sie zur Verfügung stehen.
Die Formate hingegen iterieren immer über alle Variablen und klappern diese ab.
2013-09-09T14:56:38 biancaAber meinen Lösung mit der Übergabe von ident ist optimal geeignet und der Code ist super einfach zu pflegen.
2013-09-10T07:46:04 payxFalsch kommt es mir vor, in einem print-Befehl eine sub aufzurufen
2013-09-10T07:46:04 payxDann war aber das Beispiel nicht so besonders gut dafür geeignet hier die Fragestellung zu illustrieren, denke ich.
2013-09-09T11:16:57 pq
2013-09-09T11:16:57 pqund du wunderst dich, dass ich "plötzlich" schweige?
ich hatte einfach alles dazu gesagt, was es zu sagen gab. und auf meinen vorschlag hast du ja nicht reagiert.
2013-09-09T11:16:57 pqich versteh das mit den formaten nicht, was du da anstellst, fertig.
2013-09-09T14:50:53 bianca2013-09-09T11:16:57 pq
Sorry, das habe ich im dortigen Text nicht gesehen. Sehe es nach wie vor nicht.
2013-09-08T15:46:29 pqmir fällt als config-datenstruktur nur z.b. eine routing-tabelle einer web-app ein. dort lege ich auch code-referenzen an.
aber auf die config greife ich mittels des übergebenen context-objektes zu.
2013-09-08T15:08:49 biancaDaher hatte ich gehofft, es gäbe - ähnlich wie bei Javascript - eine Art this mit dem ich auf ein anderes Element auf selber Tiefe des Astes zugreifen kann. Auf mein Beispiel bezogen hätte ich in Zeile 12 gern ein this{foo} zur Verfügung.
QuoteAber vielleicht suche ich wirklich X für Y. Wie schreibst du denn solche größeren Definitionsblöcke bei denen keine Redundanzen auftauchen sollen und deren Reihenfolge beliebig verändelich sein soll, um es optisch besser strukturieren zu können?