Thread Allg. Frage zu Referenzen (18 answers)
Opened by toppsino at 2008-04-12 17:15

murphy
 2008-04-15 19:05
#108419 #108419
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Tr0Nix+2008-04-15 16:15:32--
[...]
Was passiert, wenn ich ein anonymes Hash zurückgebe in einer Subfunktion?

Also um dein letztes Beispiel zu nehmen, statt dem hier:
Code: (dl )
my %person = ( [...] ); return \%person;


Das hier:
Code: (dl )
return ( [...] );


Zweiteres ist kein Ersatz für Ersteres! Im zweiten Fall wird nämlich kein anonymer Hash zurückgegeben, sondern einfach eine Liste von abwechselnden Schlüsseln und Werten.

Quote
.. und diesen Rückgabewert beispielsweise an einer neuen Funktion füttere:
Code: (dl )
schreibe_an(ask_person());


ask_person gibt nun eine Liste zurück, folglich werden alle Werte dieser Liste als Parameter an schreibe_an übergeben.

Quote
.. und DORT dann als Referenz behandle.

Code: (dl )
1
2
3
4
sub schreibe_an {
my $dummy = shift;
return \$dummy;
}


schreibe_an holt sich den ersten Parameter, was in Deinem Beispiel einfach der erste Schlüssel ist, den ask_person geliefert hat, und gibt eine Referenz auf diesen Skalar zurück.

Quote
Muss man da aufpassen wenn man mischt?


Ja, weil man nicht wirklich mischen kann. Parameter und Rückgabewerte von Subroutinen sind immer Listen von Skalaren, niemals Arrays oder Hashes sondern höchstens Referenzen darauf.

Du könntest Dein Beispiel aber so verändern, dass in ask_person tatsächlich ein anonymer Hash zurückgegeben wird (return { [...] }; statt return ( [...] );) und in schreibe_an dann nicht noch einmal eine Referenz auf die Referenz erzeugen. Oder Du könntest erst in schreibe_an den Hash erzeugen (my %dummy = @_; return \%dummy; statt my $dummy = shift; return \$dummy;).
When C++ is your hammer, every problem looks like your thumb.

View full thread Allg. Frage zu Referenzen