Ich muss noch einmal dieses Konstrukt diskutieren - es ist einfach zu herrlich:
$hash->{devices}[@{$hash->{devices}}]->{type} = $devicetype;
$hash->{devices}[-1]->{addr} = $addr;
$hash->{devices}[-1]->{serial} = $serial;
$hash->{devices}[-1]->{name} = "no name";
$hash->{devices}[-1]->{groupid} = $groupid;
Was wurde hier gemacht?
$hash->{devices} ist offensichtlich eine Referenz auf ein Array von Hashes (Hashrefs).
Man wollte neue Daten an dieses Array anfügen (push - normalerweise), also was macht man?
$hash->{devices}[@{$hash->{devices}}]->{type} = $devicetype;
Man ermittelt den Wert von
@{$hash->{devices}} im skalaren Kontext.
Das ist die Anzahl der Elemente in dem Array. Sagen wir 5. Da allerdings ein Array (in der Regel) bei Index 0 beginnt, sind diese 5 Elemente eben auf die Indices 0 bis 4 verteilt.
Wenn man nun auf den Index 5 zugreift, diesen als Hashref interpretiert und dem (bis dato imaginären) Element "type" einen Wert zuweist, passiert die sogenannte
autovivification (
https://perlmaven.com/autovivification) gleich zweimal:
1) Ein neues Arrayelement (Index: 5) wird angelegt, folglich hat das Array nun 6 Elemente
2) Dieses Arrayelement wird als Hashref "postuliert" und durch eine Zuweisung zu einem key ebenfalls "ins Leben gerufen".
Dieses neue Element ist somit das letzte Element in dem Array und als solches via Index -1 erreichbar, also:
$hash->{devices}[-1]und ab jetzt kann man dieses Element (ein Hashref) mit den entsprechenden Key-Value Paaren befüllen. Fantastisch!
Merke:
$array[@array]->{key1} = value1;
$array[-1]->{key2} = value2;
:=
push @array, {
key1 => value1,
key2 => value2,
};
Viele Wege führen zwar nach Rom, aber das bedeutet nicht, dass man auf einigen davon nicht "auf der Strecke bleibt".
https://de.wikipedia.org/wiki/Viamala