Ich habe anscheinend verschiedene Möglichkeiten gefunden, um die Größe eines Arrays zu ermitteln. Was ist der Unterschied zwischen diesen drei Methoden?
my @arr = (2);
print scalar @arr; # First way to print array size
print $#arr; # Second way to print array size
my $arrSize = @arr;
print $arrSize; # Third way to print array size
print 0+@arr
,print "".@arr
,print ~~@arr
"".@arr
so"@arr"
tut etwas ganz anderes.Antworten:
Der erste und der dritte Weg sind die gleichen: Sie werten ein Array im skalaren Kontext aus. Ich würde dies als Standardmethode betrachten, um die Größe eines Arrays zu ermitteln.
Der zweite Weg gibt tatsächlich den letzten Index des Arrays zurück, der (normalerweise) nicht der Arraygröße entspricht.
quelle
$[
gibt "Der Index des ersten Elements in einem Array und des ersten Zeichens in einem Teilstring" (perldoc perlvar
) an. Es ist standardmäßig auf 0 gesetzt, und es wird dringend davon abgeraten, etwas anderes als 0 zu setzen.$[
ist entmutigt (und seit einem Jahrzehnt).$[
ist veraltet. Bei der Verwendung wird$[
eine Verfallswarnung ausgegeben, auch wenn keine Warnungen aktiviert sind. Das Zuweisen von etwas anderem als Null$[
ist in 5.16 ein Fehler. Können wir schon aufhören zu erwähnen$[
?$[
würde von seinen Auswirkungen wissen.scalar @arr
und$#arr
sollte noch die möglichen Auswirkungen verstehen$[
, selten , obwohl sie sind.Erstens ist die zweite nicht gleichbedeutend mit den beiden anderen.
$#array
Gibt den letzten Index des Arrays zurück, der um eins kleiner als die Größe des Arrays ist.Die anderen beiden sind praktisch gleich. Sie verwenden einfach zwei verschiedene Mittel, um einen skalaren Kontext zu erstellen. Es kommt auf die Lesbarkeit an.
Ich persönlich bevorzuge Folgendes:
Ich finde es klarer als
und
Letzteres sieht allein so ziemlich klar aus, aber ich finde, dass die zusätzliche Zeile die Klarheit beeinträchtigt, wenn sie Teil eines anderen Codes ist. Es ist nützlich, um zu lehren, was
@array
im skalaren Kontext funktioniert, und wenn Sie$size
mehr als einmal verwenden möchten .quelle
my $size=@array
Es scheint ein Fehler zu sein, bei dem das falsche Siegel verwendet wurde.scalar
ohne Grund verwenden, lernen die falsche Lektion. Sie beginnen zu verstehen, dass Operatoren Listen zurückgeben, die zu Skalaren gezwungen werden können. Dutzende Male gesehen.scalar
weil Sie die Liste in einen skalaren Kontext zwingen. Das ist der richtige Grund, es zu benutzen. Ihr Beispiel macht genau das Gleiche, hängt jedoch davon ab, was Perl tut, wenn Sie eine Listenvariable in einem implizit skalaren Kontext auswerten. In Ihrem Beispiel muss der Leser daher über das implizite Verhalten von Perl in diesem Kontext Bescheid wissen. Sie fügen dem Ausdruck nur eine weitere Ebene impliziten Verhaltens hinzu, und Perl hat bereits zu viel implizites Verhalten, das Sie durchdenken müssen, um ein Programm zu entschlüsseln.scalar
weil Sie die Liste in einen skalaren Kontext zwingen". Sie haben meinen Standpunkt unter Beweis gestellt, die falsche Lektion zu lernen. Das ist völlig falsch. Keine Liste wird jemals von gezwungenscalar
. (Wenn ja,scalar(@array)
undscalar(@array[0..$#array])
würde die gleiche Sache zurückzukehren.)scalar(@array)
Erzählt@array
einen skalar zurückzukehren, mit dem Sie ihm schon gesagt , mit dem zu tunmy $size=
.Dadurch wird die Größe ermittelt, indem das Array in einen skalaren Kontext gezwungen wird, in dem es als seine Größe ausgewertet wird:
Dies ist eine weitere Möglichkeit, das Array in einen skalaren Kontext zu zwingen, da es einer skalaren Variablen zugewiesen wird:
Dadurch wird der Index des letzten Elements im Array abgerufen, also tatsächlich die Größe minus 1 (vorausgesetzt, die Indizes beginnen bei 0, was in Perl einstellbar ist, obwohl dies normalerweise eine schlechte Idee ist):
Letzteres ist nicht wirklich gut, um die Array-Größe zu ermitteln. Es wäre nützlich, wenn Sie nur das letzte Element des Arrays erhalten möchten:
Wie Sie hier bei Stack Overflow sehen können, wird dieses Konstrukt von den meisten Syntax-Textmarkern nicht korrekt behandelt ...
quelle
$arr[-1]
, um das letzte Element zu erhalten. Und$arr[-2]
um den vorletzten zu bekommen und so weiter.$#arr
ist dies keine sehr nützliche Funktion, und es ist kein Zufall, dass andere Sprachen sie nicht haben.Um den zweiten Weg zu verwenden, fügen Sie 1 hinzu:
quelle
for [0..$#array] { print $array[$_ ] }
funktioniert jedoch sehr gut, wenn der Zweck des Abrufs der Anzahl der Elemente darin besteht, das Array zu durchlaufen. Der Vorteil ist, dass Sie das Element sowie einen Zähler erhalten, die ausgerichtet sind.Alle drei ergeben das gleiche Ergebnis, wenn wir das zweite etwas ändern:
quelle
Beispiel:
quelle
Der Abschnitt „Perl-Variablentypen“ in der Perlintro-Dokumentation enthält
Die Perldata-Dokumentation behandelt dies auch im Abschnitt „Skalarwerte“ .
Weiter oben im selben Abschnitt wird dokumentiert, wie der Index des letzten Elements eines Arrays ermittelt wird.
quelle
Es gibt verschiedene Möglichkeiten, die Größe des Arrays zu drucken. Hier sind die Bedeutungen von allem: Nehmen wir an, unser Array ist
my @arr = (3,4);
Methode 1: Skalar
Dies ist der richtige Weg, um die Größe von Arrays zu ermitteln.
Methode 2: Indexnummer
$#arr
gibt den letzten Index eines Arrays an. Wenn das Array also die Größe 10 hat, ist sein letzter Index 9.Wir fügen hier 1 hinzu, wobei das Array als 0-indiziert betrachtet wird . Wenn es jedoch nicht auf Null basiert, schlägt diese Logik fehl .
Das obige Beispiel gibt 6 aus, da wir den Anfangsindex auf 4 gesetzt haben. Jetzt wäre der Index 5 und 6 mit den Elementen 3 bzw. 4.
Methode 3:
Wenn ein Array im skalaren Kontext verwendet wird, gibt es die Größe des Arrays zurück
Tatsächlich sind Methode 3 und Methode 1 gleich.
quelle
Aus perldoc perldata , die sicher zu zitieren sein sollten:
Nur solange Sie nicht $ # was auch immer ++ und auf mysteriöse Weise die Größe oder Ihr Array erhöhen.
und
Was mich zu dem bringt, wonach ich gesucht habe, ist, wie man erkennt, dass das Array leer ist. Ich habe es gefunden, wenn $ # leer == -1;
quelle
Was ist,
int(@array)
wenn es das Argument als Skalar bedroht ?quelle
Um die Größe eines Arrays zu ermitteln, verwenden Sie das
scalar
Schlüsselwort:Um den letzten Index eines Arrays herauszufinden, gibt es
$#
(Perl-Standardvariable). Es gibt den letzten Index eines Arrays an. Wenn ein Array bei 0 beginnt, erhalten wir die Größe des Arrays, indem wir eins hinzufügen zu$#
:Beispiel:
Ausgabe:
quelle