Thread Array::Utils: Wie Rückgabewert als Liste interpretieren (34 answers)
Opened by mika at 2018-11-18 12:25

haj
 2018-11-19 12:11
#189236 #189236
User since
2015-01-07
557 Artikel
BenutzerIn

user image
Die offizielle Beschreibung ist in Perldoc:perlfaq4, aber so ganz glücklich bin ich damit nicht. Ein paar Eigenschaften von Perl sind da etwas schräg, und wenn ich mich recht erinnere, sind sie deswegen so schräg, weil sie schon in Perl 4 so waren. Insbesondere bei den eingebauten Funktionen wie push.

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).

View full thread Array::Utils: Wie Rückgabewert als Liste interpretieren