6 Stimmen

Gibt es einen Vorteil bei der Verwendung der Schlüssel @array anstelle von 0 $#array?

Ich war ziemlich überrascht, als ich feststellte, dass die keys Funktion arbeitet gerne mit Arrays:

keys HASH
keys ARRAY
keys EXPR

Gibt eine Liste zurück, die aus allen Schlüsseln des benannten Hashes besteht, oder die Indizes eines Arrays. (Im skalaren Kontext wird die Anzahl der Schlüssel oder Indizes zurück.)

Gibt es einen Vorteil bei der Verwendung von keys @array anstelle von 0 .. $#array im Hinblick auf Speicherverbrauch, Geschwindigkeit usw., oder sind die Gründe für diese Funktionalität eher historischer Natur?

Wenn man sieht, dass keys @array hält bis zu $[ Änderung, ich vermute, es ist historisch:

$ perl -Mstrict -wE 'local $[=4; my @array="a".."z"; say join ",", keys @array;'
Use of assignment to $[ is deprecated at -e line 1.
4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29

4voto

Tanktalus Punkte 20746

Ich denke, Mark hat teilweise recht. Was er vermisst, ist, dass each jetzt mit einem Array arbeitet und, wie das each mit Hashes, each mit Arrays zwei Elemente bei jedem Aufruf zurückgibt. Wo each %hash gibt Schlüssel und Wert zurück, each @array gibt auch Schlüssel (Index) und Wert zurück.

while (my ($idx, $val) = each @array)
{
  if ($idx > 0 && $array[$idx-1] eq $val)
  {
     print "Duplicate indexes: ", $idx-1, "/", $idx, "\n";
  }
}

Vielen Dank an Zaid für die Anfrage, und jmcnamara für die Erwähnung auf Perlmonks' CB. Ich habe nicht gesehen, dies vor - ich habe oft durch ein Array geschleift und wollte wissen, welcher Index ich bin. Das ist um Längen besser als die manuelle Manipulation einiger $i Variable, die außerhalb einer Schleife erstellt und innerhalb inkrementiert wird, da ich davon ausgehe, dass continue , redo usw., werden dies besser überstehen.

Da wir nun also die Möglichkeit haben each auf Arrays, müssen wir in der Lage sein, den Iterator zurückzusetzen, und daher haben wir keys .

3voto

Mark Punkte 1028

Der Link, den Sie angegeben haben, enthält einen wichtigen Grund, den Sie nutzen oder nicht nutzen können keys :

Als Nebeneffekt setzt der Aufruf von keys() den internen Interator des HASH oder ARRAY zurück (siehe jeweils). Insbesondere der Aufruf von keys() im void-Kontext setzt den Iterator ohne weiteren Overhead zurück.

Das würde dazu führen, dass each um an den Anfang des Arrays zurückzukehren. Verwendung von keys y each mit Arrays könnte wichtig sein, wenn sie jemals nativ unterstützen sparse Arrays als eine echte Daten-Typ.

Abgesehen davon gibt es so viele Array-fähige Sprachkonstrukte wie foreach y join in Perl, ich kann mich nicht mehr erinnern, wann ich das letzte Mal 0..$#array .

2voto

Chris Jester-Young Punkte 212385

Ich denke eigentlich, dass Sie Ihre eigene Frage beantwortet haben: Es gibt die gültigen Indizes des Arrays zurück, unabhängig davon, welchen Wert Sie für gesetzt haben $[ . Unter dem Gesichtspunkt der Allgemeinheit (vor allem für die Verwendung in Bibliotheken) ist es also vorzuziehen.

Die Version von Perl, die ich habe (5.10.1), unterstützt nicht die Verwendung von keys mit Arrays, also kann es nicht aus historischen Gründen sein.

0voto

Rahul Punkte 73710

In Ihrem Beispiel fügen Sie sie in eine Liste ein; in einem Listenkontext also

keys @array wird durch alle Elemente des Arrays ersetzt ersetzt, während 0 .. $#array macht das Gleiche, aber als Array-Slicing; also stattdessen $array[0 .. $#array] Sie können auch erwähnen $array[0 .. (some specific index)]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X