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

haj
 2018-11-18 14:47
#189224 #189224
User since
2015-01-07
527 Artikel
BenutzerIn

user image
Deswegen schrob ich ja, dass das etwas spitzfindig ist. In vielen Fällen sind Arrays und Listen austauschbar - aber nicht in allen. Genauer: Eine Liste ist gar kein Datentyp, sondern eine durch Kommas getrennte Folge von Werten. Und was man an Unterprogramme übergibt und von ihnen zurückbekommt, sind Listen und keine Arrays.

Perl braucht ein "richtiges" Array, also etwas, das mit @ anfängt, wenn syntaktisch klar sein muss, wo es aufhört - und das ist bei Funktionen wie splice und push der Fall. Da ist bei push(@a,1) das @a das erste Element der Liste und der Einser das zweite.

In eigenen Unterprogrammen kann man den Unterschied (nur) dann sehen, wenn man das Unterprogramm mit Prototypen ausstattet - genau wie CPAN:Array::Utils das macht. Ohne den Prototyp
sub array_minus(\@\@) bekäme array_minus eine einzige Liste von Parametern, gebildet aus allen Elementen der beiden Arrays nacheinander.

Deine Beschreibung meines Vorgehens ist richtig: Ich dereferenziere eine Array-Referenz - und die kann ich mit einer Liste initialisieren.

...und übrigens: Raubtier hat schon Recht mit dem Hinweis, dass ein splice vielleicht nicht das richtige ist, wenn man nur den Rückgabewert braucht - das wäre dann eher ein Slice. Und einen Slice kann man - neben der Nutzung des Moduls - auch zu Fuß haben. Ein Slice geht sowohl auf Arrays wie auch auf Listen:
Code (perl): (dl )
1
2
3
4
my @new = (1,2,3,4);
my @old = (4,5,6,7,8);
push @new, (array_minus( @old, @new))[0..2]; # Einzeiler
print join ",",  @new;


Am FAQ-Eintrag, den Raubtier ja ebenfalls angegeben hat, finde ich den ersten Satz ein bisschen irreführend;
Quote
A list is a fixed collection of scalars.

Es ist ein bisschen mehr als das, denn sonst wüsste array_minus( @old, @new) nicht, wo @old aufhört und @new beginnt.

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