Die Anzahl der Werte in einer Liste kann nur bestimmt werden, indem man über ihre Werte iteriert oder sie in ein Array umwandelt. Wenn Sie es einem Skalar zuweisen, wird die Anzahl der Elemente nicht zurückgegeben:
%Vor%Es gibt ein "leere Klammern" Idiom, das verwendet werden kann, um die Anzahl der Elemente zu erhalten:
%Vor%Ist dies intern äquivalent zu
? %Vor%?
Dies ist ein interessantes Implementierungsdetail: Erstellt die Zuweisung zu einer leeren Liste ein (unnötiges) anonymes Array?
Es gibt zwei Möglichkeiten, diese Frage zu beantworten: Erstens, Der richtige Weg: Versuchen Sie herauszufinden, wie dies in der Quelle gehandhabt werden könnte. Gibt es einen Sonderfall für die Zuweisung zu einer leeren Liste, die im skalaren Kontext ausgewertet wird?
Als fauler und ignoranter Typ wählte ich Benchmark :
%Vor%Ich habe den Benchmark einige Male ausgeführt, und die Zuweisung zur leeren Liste hatte in allen Fällen einen leichten Vorteil. Wenn der Unterschied rein zufällig ist, ist die Wahrscheinlichkeit 10 Zeitpunkte zu beobachten, alle zugunsten von Ziege weniger als 0,1%, also gehe ich davon aus, dass es einen Kurzschluss gibt.
Auf der anderen Seite, wie der Benchmark @daotoad in den Kommentaren ausgeführt, gibt wahrscheinlich ein vollständigeres Bild:
%Vor% Typische Ergebnisse auf meinem Computer (Windows XP Pro SP3, Core 2 Duo, 2 GB Arbeitsspeicher, ActiveState perl
5.10.1.1006):
Und mit:
%Vor%Die Ergebnisse sind:
%Vor% Verwenden Sie im Zweifelsfall my $n = () = ...;
Die zwei Gegenstände, die Sie gezeigt haben, sind nicht gleichwertig. Aber sie haben das gleiche Endergebnis;
%Vor% Hier erstellen Sie ein anonymes Array [ 'a', 'b', 'c' ]
, dann deneferenzieren Sie es und nehmen Sie die Anzahl der Mitglieder. Die Erstellung des Arrays stellt den Kommaoperatoren in der Anweisung einen Listenkontext zur Verfügung.
Hier benutzen wir den berüchtigten "Ziegenoperator". Die Liste ('a', 'b', 'c')
wird einer leeren Liste () = ('a', 'b', 'c');
zugewiesen. Das Ergebnis der Listenzuordnung wird $n
zugewiesen. Listenzuordnung gibt die Anzahl der Elemente auf der rechten Seite der Zuweisung im skalaren Kontext zurück (im Listenkontext erhalten Sie die Liste der zugewiesenen Werte).
Bei Verwendung in einem skalaren Kontext wird eine Liste mit der Anzahl der darin enthaltenen Elemente ausgewertet:
%Vor%Um einen expliziten Test durchzuführen, wie in einer if-Bedingung:
%Vor%Das funktioniert auch ohne das Skalar-Schlüsselwort. Dies kann jedoch dazu führen, dass der Code schwer zu scannen ist. Kontext ist eine wunderbare Idee, aber es erfordert mehr Arbeit vom Leser. Durch die Verwendung von Skalar kann der Leser sofort erkennen, dass Sie @list in einem skalaren Kontext evaluieren.
Wie finde ich die Anzahl der Werte in eine Perl-Liste?
Weisen Sie die Liste einer @array
-Variablen zu und ermitteln Sie die Größe von @array
mit scalar(@array)
oder verwenden Sie die Operation $#array+1
. Definieren Sie sub count {scalar @_}
und verwenden Sie Aufrufe von count
, wenn Sie dies viel tun müssen.
Sicher kannst du das verwenden ... wenn du möchtest, dass Perl weiterhin einen schlechten Namen als schreibgeschützte Sprache hat ...: (
Um die Größe des Arrays zu lernen:
Verwenden Sie scalar()
, um es explizit zu machen (für Array-Referenzen müssen Sie sie über @{...}
abziehen):
Verwenden Sie $#
(add plus eins, um die Größe zu erhalten):
Perl: Es gibt mindestens zwei Möglichkeiten, dies zu tun:)