Wie finde ich die Anzahl der Werte in einer Perl-Liste?

7

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%

?

    
Eugene Yarmash 08.02.2010, 22:43
quelle

7 Antworten

6

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):

%Vor%

Und mit:

%Vor%

Die Ergebnisse sind:

%Vor%

Fazit:

Verwenden Sie im Zweifelsfall my $n = () = ...;

    
Sinan Ünür 08.02.2010, 23:12
quelle
8

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.

%Vor%

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).

    
daotoad 08.02.2010 23:04
quelle
4

Nein. Es entspricht:

%Vor%

... da der Zuweisungsoperator rechtsassoziativ ist. Die Auflistung in Klammern in der rechten Liste befindet sich selbst im skalaren Kontext und daher ist ihr Wert die Anzahl der Elemente auf der rechten Seite.

    
Sean 08.02.2010 23:10
quelle
1

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.

    
Jeff Ober 09.02.2010 00:45
quelle
1
  

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.

%Vor%

Sicher kannst du das verwenden ... wenn du möchtest, dass Perl weiterhin einen schlechten Namen als schreibgeschützte Sprache hat ...: (

    
Offer Kaye 09.02.2010 16:02
quelle
1

Sie können den folgenden Code auch verwenden, um die Anzahl der Elemente im Array oder in der Liste zu zählen

%Vor%     
muruga 02.03.2010 04:12
quelle
-2

Um die Größe des Arrays zu lernen:

  1. Verwenden Sie scalar() , um es explizit zu machen (für Array-Referenzen müssen Sie sie über @{...} abziehen):

    %Vor%
  2. Verwenden Sie $# (add plus eins, um die Größe zu erhalten):

    %Vor%

Perl: Es gibt mindestens zwei Möglichkeiten, dies zu tun:)

    
dma_k 08.02.2010 22:56
quelle

Tags und Links