Thread Array::Utils: Wie Rückgabewert als Liste interpretieren
(34 answers)
Opened by mika at 2018-11-18 12:25
Die offizielle Beschreibung ist in
![]() Ich sehe das phänomenologisch: Eine Liste ist kein Perl-Datentyp, sondern Zeug rund ums Komma. Es gibt ein paar Operationen, bei denen der Interpreter eine Liste anders behandelt als ein Array. Die meiner Meinung nach einzige daraus resultierende Möglichkeit mit praktischer Bedeutung haben wir hier gerade im Thread vor uns: Bei der Übergabe an eine Funktion wird eine Liste übergeben. Das ermöglicht der Subroutine, die Liste (@a,@b) durch Angabe eines Prototyps (\@\@) als zwei Referenzen auf die ursprünglichen Arrays in @_ zu erhalten: @_ = (\@a,\@b) - anstatt die einzelnen Elemente von @a und @b hintereinandergereiht. Es funktioniert auch nur, wenn wirklich Dinge mit dem Datentyp Array übergeben werden. Denn weil eine Liste kein Datentyp ist, gibt's auch keine Referenz auf eine Liste. Die zweite Möglichkeit, bei der Listen anders behandelt werden, ist die Referenzierung mit \. Man erkennt da schon eine Verwandschaft mit Prototypen. Ich habe das noch nie gebraucht: Code (perl): (dl
)
1 2 3 4 5 my @a = ('a','A'); my @b = ('b','B'); my @ref = \(@a,@b); # @ref = (['a','A'],['b','B']) sub l { my @l = (1,2); return @l; } my @lref = \l; # @lref = (\1, \2) - Return-Werte sind Listen! Disclaimer: Ich selbst habe noch nie Prototypen verwendet (und übrigens auch kein wantarray). |