Thread Rückgabe mehrerer Hashes geht nicht (22 answers)
Opened by SchaubFD at 2008-02-13 09:24

KurtZ
 2008-02-14 02:00
#105858 #105858
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
@Ronnie: Vielen Dank fürs Lob :-)
(Aber ich zweifle ob Perls Objektorientierung für Anfänger eine Vereinfachung darstellen, insbesondere weil man den Pfeilsyntax nicht los wird.)

die Aufgabenstellung lässt sich locker vereinfachen, sehr selten braucht man mehrere Hashes zurückzugeben, oft reicht eine mehrfach verschachtelte Struktur, also
statt
Code (perl): (dl )
1
2
3
4
$A{1} = "Hugo";
$B{1} = "Schmitt";
$C{1} = "Vorsitzender";
my $Count = 1;

braucht man eher
Code (perl): (dl )
1
2
3
4
5
6
7
sub init_personen{
  my @personen;
  $personen[0]{ vorname } = "Hugo";
  $personen[0]{ nachname } = "Schmitt";
  $personen[0]{ stellung } = "Vorsitzender";
  return @personen;
}

Und schon braucht man nur noch ein Array zurückzugeben!
Will man also eine Kopie des Arrays, schreibt man dann
Code (perl): (dl )
@copy_personen=init_personen();


Will man aber ein Alias, dann sollte man einfach schon beim Aufruf eine Referenz aufs Zielarray übergeben, also:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
sub init_personen{
  my $p_ref=shift; 
  $p_ref->[0]{ vorname } = "Hugo";
  $p_ref->[0]{ nachname } = "Schmitt";
  $p_ref->[0]{ stellung } = "Vorsitzender";
}

my @alias;
init_personen ( \@alias );
print $alias[0]{ nachname }


Natürlich könnte man auch mehrere Refs übergeben, wenn man wirklich mehrere Hashes braucht... im Grunde verlagert man so nur den Pfeilsyntax ins Innere der Routine, wo's weniger stört.

Noch zwo Optionen hätte man, die ich aber nicht wählen würde...

1. Wenn man partout nicht mit Pfeilen dereferenzieren will, kann auch den $$ syntax benutzen ( allerdings nur wenn man sicher ist, später den Überblick zu behalten, was man da tut ). Also

Code (perl): (dl )
  $$p_ref[0]{ vorname } = "Hugo"; 


2. Entsprechend "geprototyped" kann man sich auch Backslashes sparen

Code (perl): (dl )
1
2
3
4
5
6
7
8
sub init_personen ( \@ ) {
  my $p_ref=shift; 
  $p_ref->[0]{ vorname } = "Hugo";
  $p_ref->[0]{ nachname } = "Schmitt";
  $p_ref->[0]{ stellung } = "Vorsitzender";
}

init_personen( my @alias ) ;# Aufruf mit unsichtbarer impliziter Referenzierung 


Allerdings für eine einmalig aufgerufene Routine ist sowas eher overkill, schließlich macht man sich dadurch den Routinenaufruf ein Stück missverständlicher!

Zu guter Letzt kann man die Routine auch zusätzlich eine Kopie des Arrays zurückgeben, d.h. man kann sich je nach Aufrufmethode aussuchen was man raushaben möchte.


Noch ein Wort zu Packagevariablen ... besagtes Python hat meines Wissen selbst keine lexikalische Variablen und ich kann auch keinen echten Nachteil darin sehen in Fällen, in denen sich Aliase wirklich lohnen mit Typeglobs zu arbeiten.

Denn Aliase lohnen sich vor allem bei sehr häufig aufgerufenen Variablen, d.h. dass sie auch irgendwie "Packetcharakter" haben. Und durch lokalisieren mit "local" wird auch der Geltungsbereich eindeutig beschnitten.
TMTOWTDYOG (there's more than one way to dig your own grave)

View full thread Rückgabe mehrerer Hashes geht nicht