Eine eigentümliche Eigenart von Perl ist, dass man einen Datentyp Hash nicht als Parameter übergeben kann.
Du wirst jetzt sagen: Geht doch!
Nicht so wirklich. Was Perl macht, wenn du einen Hash übergibst ist, es walzt diesen Hash auseinander und übergibt ihn als einzelne Parameter.
Klingt komisch, ist komisch, ist aber halt so. Und wenn mans gewohnt ist auch gar nicht so schlimm.
Also Wenn du schreibst
subroutine($a, $b, %hash)
dann machst du in Wirklichkeit:
subroutine($a, $b, $hash_key1, $hash_value1, $hash_key2, $hash_value2, ...)
Und auf der anderen Seite kannst du dann $a wieder zuweisen, $b wieder zuweisen und Perl recht einfach sagen: Mach mir aus dem Rest, der ankommt wieder einen Hash. D.h. da wird aus dem Salat wieder ein neuer Hash gebastelt.
Wenn du nun 2 Hashes übergibst, dann gibts auch 2mal diesen Salat hintereinander. Und dann hast du ein Problem, weil Perl nicht mehr weiß wo Salat1 aufhört (Hash1) und Salat2 (Hash2) anfängt.
Das gleiche Problem hast du, wenn nach dem Hash noch Parameter kommen. Also wo hört der Salat auf und wo fangen die Parameter an.
In diesem Fall ( und im Zweifelsfall eigentlich immer) übergibt man Referenzen. Eine Referenz ist sowas wie eine Beschreibung oder auch Adresse wo im Computerspeicher dieser Hash liegt.
Also
subroutine($a, $b, \%hash1, \%hash2, ...)
übergibt keinen Salat, sondern neben $a und $b einfach nur 2 Adressen. Und mit diesen 2 Adressen kriegst du auf der anderen Seite wieder deine Hashes.
Last edited: 2015-07-01 15:33:12 +0200 (CEST)
1 + 1 = 10