Die fetchall_arrayref() gibt einen Verweis auf ein Array aller Zeilen zurück, in dem jedes Element auch ein Verweis auf ein Array mit den Elementen dieser Zeile ist.
Dann wird die die
Zeilen überprüft
, dass die Top-Level-Referenz $r
definiert ist (dass der Anruf bearbeitet) und
, dass die Größe des Arrays, @$r
, genau 1
– also, dass das Array genau ein Element enthält. Dies verrät die Erwartung, dass die Abfrage eine Zeile zurückgeben wird, und da der Code auf die
vorbereitet ist, kann es nach einer Zeile fragen, durch fetchrow_arrayref oder fetchrow_array.
Die @$r
dereferenziert die $r
ArrayRef und im skalaren Kontext von !=
auferlegt wir in der Tat die Anzahl der Elemente in der Liste bekommen.
Die Zeile 5 ist sehr irreführend, um es gelinde auszudrücken, auch wenn die Syntax legitim ist: Sie extrahiert das erste Element und füttert es in einen Skalar, verwendet aber @$r[0]
Syntax, die normalerweise bedeuten würde, dass wir ein erhalten Liste, durch sein Sigil @
. Es entspricht @{$r}[0]
und ist ein Missbrauch der Notation.
Es sollte entweder eindeutig das erste Element erhalten, wenn das die Absicht
my $rr = $r->[0];
oder auch dereferenzieren das gesamte Array
my @row = @{ $r->[0] };
zu erhalten, wenn das gewollt ist.
Die letzte Zeile, die Sie abfragen, ist genau das gleiche, unter Verwendung der abgerufenen $rr
Referenz. Aber das erste Element des ersten ArrayRef (row) leicht direkt
erhalten
my $rec = $r->[0]->[0]; # or $r->[0][0]
was Linien ersetzt 5 und 6
Siehe perlreftut und perldsc.