Thread Umgang mit referenzierten Arrays: Schön schreiben No. 2 (8 answers)
Opened by Sven_123 at 2011-09-30 11:50

Sven_123
 2011-09-30 11:50
#152797 #152797
User since
2010-06-01
120 Artikel
BenutzerIn
[default_avatar]
Hallo,
Moritz' Vorschlag, Variablen, die ich aus einer Datei auslese einfach komplett in einem Hash zu speichern, hat mich auf etwas gebracht, dass ich bei dem Programm, das ich grad schreib gern ändern würde.
Nochmal: Ich lese aus einer Datei, abhängig von verschiedenen Optionen Informationen aus, um sie weiter zu benutzen - z.B. Gradienten. Bisher hatte ich eine Variable @grad, in der immer der Gradient zu den aktuellen Optionen gespeichert war, aus Vergleichsgründen wäre es allerdings manchmal nicht schlecht verschiedene Gradienten zu speichern. Eine Möglichkeit wär nun zig Variablen einzuführen, die ich nach den verschiedenen Optionen benenn, besser gefällt mir allerdings einfach nur einen Hash zu haben, in dem ich dann unter z.B. @{$var{'grad'}{'modus1'}} das Zeug abspeicher.

Da ich aber viel mit den Informationen rumrechne, wird es irgendwann unübersichtlich, wenn ich das "{'grad'}{'modus1'}" etc. immer mitschleifen muss, weswegen ich trotzdem gerne eine Variable, z.B. @grad mitführen würde, die immer auf die entsprechende Information des aktuellen Modus zeigt. An einer einfachen Referenz, wie im ersten Teil des Beispiels hier gezeigt gefallen mir aber die $ und -> nicht so sehr (Zeile 15). Lieber wäre es mir, wirklich die Arrayreferenzen in einem eigenen Array abzuspeichern, wie im zweiten Teil gezeigt:
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
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

#+~~~~~~~ Referenz
{
 my %vars;
 my $mode = 1;
 my $curr_grad =\$vars{'gradient'}{$mode};

 #...tu was...
 $vars{'gradient'}{1} = [[1,1,1],[1,2,3]];

 print $$curr_grad->[1][1]++,"\n";
 print $vars{'gradient'}{$mode}[1][1],"\n";
}

#+~~~~~~~ Array
{
 my %vars;
 my $mode = 1;
 $vars{'gradient'}{1} = [[],[]];
 my @curr_grad = @{$vars{'gradient'}{$mode}};

 #...tu was...
 (@{$vars{'gradient'}{1}[0]}[0..2],@{$vars{'gradient'}{1}[1]}[0..2]) = ((1,1,1),(1,2,3));

 print $curr_grad[1][1]++,"\n";
 print $vars{'gradient'}{$mode}[1][1],"\n";
}

Unten stört mich ein bisschen die Notwändigkeit $vars{'gradient'}{1} erst befüllen zu müssen (Zeile 23), aber v.a., dass man beim Befüllen der Arrays wahnsinnig vorsichtig und umständlich sein muss (Zeile 27), dass man nicht plötzlich einen neuen anonymen Array erstellt.

Ich hab mich noch für keine der beiden Methoden entschieden, entweder ich nehm das kleinere Übel (Zeile 15, die Referenzen) oft in Kauf, oder das große (Zeile 27, das Array Befüllen) nur ein paar mal...

Gibt es sinnvolle, gänzlich andere Methoden, oder hat jemand Vorschläge, wie ich bei einem der beiden noch was verbessern kann?

View full thread Umgang mit referenzierten Arrays: Schön schreiben No. 2