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?
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.
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
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:
perldoc perlreftut
perldoc perlref
perldoc perldsc
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:
Und eine Liste von Listen auf einmal zu erstellen ist so einfach wie:
%Vor% für einen bestimmten Wert in $num_lists
.