Arrays dynamisch in Perl erstellen

7

Ich möchte Arrays basierend auf der Benutzereingabe dynamisch erstellen. Wenn der Benutzer beispielsweise eine Eingabe als 3 gibt, sollten drei Arrays mit dem Namen @message1 , @message2 und @message3 erstellt werden.

Wie mache ich das in Perl?

    
Senthil kumar 23.08.2010, 06:35
quelle

4 Antworten

17

Nicht. Verwenden Sie stattdessen ein Array von Arrays:

%Vor%

Einige hilfreiche Regeln finden Sie unter Ссылка

    
ysth 23.08.2010 06:45
quelle
12

Ich muss fragen, warum du das machen willst, weil es nicht der richtige Weg ist. Wenn Sie drei Eingabestreams haben, von denen jeder als Liste gespeichert werden muss, speichern Sie eine -Liste, bei der es sich um eine Liste der Listen handelt (in denen die Listen als Arrayreferenzen gespeichert sind) ):

%Vor%

Wenn Sie den Daten jedes Benutzers Namen zugeordnet haben, möchten Sie diese möglicherweise verwenden als Hash-Schlüssel zum Indizieren der Daten gegen:

%Vor%

Weitere Informationen finden Sie im Perl Data Structures Cookbook ( perldoc perldsc ) bei der Auswahl der richtigen Datenstruktur für die Situation, und wie zu definieren sie.

    
Ether 23.08.2010 06:43
quelle
3

Das dynamische Erstellen neuer benannter Arrays ist fast nie eine gute Idee. Mark Dominus, Autor des aufklärerischen Buches Perl höherer Ordnung , hat ein drei - Teil Serie mit Einzelheiten zu den Fallstricken.

Sie haben Namen für diese Arrays, also legen Sie sie in einen Hash:

%Vor%

Für ein schnelles Beispiel, das die Struktur zeigt, ist der Code unten

%Vor%

Ausgaben

%Vor%

Wenn Sie eine andere Anzahl von Arrays angeben, erhalten wir

%Vor%

Die Reihenfolge der Schlüssel sieht witzig aus, weil sie in einem Hash, einer ungeordneten Datenstruktur, liegen.

Erinnern Sie sich daran, dass [] einen Verweis auf ein neues anonymes Array erstellt, also zum Beispiel Werte zu message2 hinzufügen würden, würden Sie

schreiben %Vor%

Um es zu drucken, würden Sie

schreiben %Vor%

Vielleicht möchten Sie stattdessen wissen, wie lange alle Arrays sind:

%Vor%

Weitere Informationen zur Verwendung von Referenzen in Perl finden Sie in der folgenden Dokumentation:

Greg Bacon 23.08.2010 15:47
quelle
2

In kompilierten Sprachen haben Variablen keinen Namen. Der Name, den Sie im Code sehen, ist eine eindeutige Kennung, die mit einem numerischen Offset verknüpft ist. In einer Kennung wie message_2 dient die '2' nur dazu, eine eindeutige Kennung zu bilden. Jeder kann sagen, dass Sie Ihre drei Variablen machen könnten: message_125 , message_216 und message_343 . Solange Sie wissen, was Sie in was tun sollten, funktionieren sie genauso gut wie message_1 ...

Der "Name" der Variablen dient nur dazu, dass Sie sie gerade halten, während Sie den Code schreiben.

Dynamische Sprachen fügen Fähigkeiten hinzu, indem die Symboltabelle (n) nicht bereinigt werden. Aber eine Symboltabelle ist einfach eine Assoziation eines Namens mit einem Wert. Da Perl Ihnen Listen und Hashes so günstig zur Verfügung stellt, ist es nicht notwendig, die Programmierung / logistische Methode zu verwenden, um Variablen zu verfolgen, um einen flexiblen Laufzeitzugriff zu ermöglichen.

Wenn Sie sehen, dass sich die Namen @message1 , @message2 , ... - in denen sich die Elemente nur durch ihre Referenzreihenfolge unterscheiden, sind die Chancen, dass diese Namen genauso gut sind: $message[1] , $message[2] , ....

Da Symboltabellen normalerweise von Name zu Offset (entweder auf dem Stack oder im Heap) abbilden, ist es tatsächlich nicht viel mehr als ein Schlüssel / Wert-Paar, das Sie in einem Hash finden Hashes funktionieren genauso gut zum Nachschlagen von eindeutigen Namen.

%Vor%

Ich meine wirklich, wenn Sie wollten, könnten Sie alles, was Sie in eine lexikalische Variable geschrieben haben, in einem einzigen Hash für den Bereich speichern, wenn es Ihnen nichts ausmacht zu schreiben: $h{variable_name} für alles. Aber Sie würden nicht den Vorteil von Perls implizitem Scope-Management bekommen, und Programmierer bevorzugen implizite Scope-Management.

Perl erlaubt symbolische Manipulation, aber im Laufe der Jahre haben die dynamischen Sprachen das als einen gemischten Segen empfunden. Aber in Perl hast du beide "Perspektiven", um ihnen einen Namen zu geben. Da Sie feststellen können, welcher Code in einer kompilierten Sprache wahrscheinlich besser ist als eine dynamische Sprache, wurde festgestellt, dass es fehlerfreier ist, eine "kompilierte Perspektive" für mehr Dinge zu verwenden: So wie Sie mit der Verfügbarkeit von Offset-Management sehen können und kompiliertes Lookup-Verhalten, das Ihnen in Core Perl gegeben wurde, gibt es keinen Grund, sich mit der Symboltabelle zu befassen, wenn Sie nicht müssen.

Ein Array dynamisch erstellen, ist so einfach wie: [] . Wenn wir nicht genau wissen, wie viele Speicher wir speichern wollen, ist es so einfach wie:

%Vor%

Und eine Liste von Listen auf einmal zu erstellen ist so einfach wie:

%Vor%

für einen bestimmten Wert in $num_lists .

    
Axeman 23.08.2010 14:27
quelle

Tags und Links