User since
2008-07-23
11
Artikel
BenutzerIn
Hallo Perl Gemeinde,
nachdem mir bei einem 1.ten Problem wunderbar geholfen wurde, hoffe ich, dass ihr mir auch bei einem 2.ten problem helfen könnt.
Also was ich gerne möchte, ist eine Statemachine in Perl zu proggen..
..und zwar eine "konfigurierbare".
Habe mir das in etwas so vorgestellt (Pseudocode):
States = {
{StateId_1, PreStateId_0, PostStateId_2, Function_1, ErrState_7},
{StateId_2, PreStateId_1, PostStateId_3, Function_2, ErrState_7},
{StateId_3, PreStateId_2, PostStateId_1, Function_3, ErrState_7}, ....{StateId_7, PreStateId_0, PostStateId_0, Function_7, ErrState_7} }
D.h. jeder Zustand wird durch eine Liste repräsentiert mit den Einträgen:
Id, VorgängerId, NachfolgerId, Funktion, FehlerId
D.h in Perl bräuchte ich ein Array von Arrays - gibts sowas?
(hab da was über Array Referenzen gelesen..ist das das richtige?)
Ferner: in C kennt man Funktionszeiger..gibts sowas auch in Perl?
Wenn ich z.B wie oben einen Funktionsnamen angebe (subroutine),
kann dann Perl diese via Fkt.zeiger ausführen?
Die Statemachine wird über den Anfangszustand gestartet und läuft solange,
bis entweder ein Endzustand oder ein Fehlerzustand erreicht wird
(über eine while-schleife).
Die Übergänge werden anhand der jeweiligen Funktionen gemacht, indem die angegebene Funktion(Subroutine) aufgerufen und ausgewertet wird.
Hoffe es war verständlich, was ich beabsichtige.
Eine Bitte hätte ich noch...bitte nur sagen ob obiges überhaupt möglich ist
(ala Array[Arrays] und Fkts.zeiger) vlt. mit einem kleinen Bsp.
Ich möchte nicht, dass jemand das für mich programmiert, sondern falls ich das geproggt habe mal drüberschaut.
=> ich möchte kleine Denkanstösse, Hilfestellungen - keine "fertigen Arbeiten"
Danke schonmal für eure Antworten.
Gruss
Ens
User since
2003-08-04
14371
Artikel
ModeratorIn
"Mehrdimensionale" Arrays:
my @array = (["0,0","0,1"],["1,0","1,1"]);
print $array[0]->[1];
Siehe auch
perlreftut
Du kannst auch Referenzen auf Subroutinen nehmen und die später über Dereferenzierung aufrufen:
my $subref = \&test;
$subref->();
sub test {
print "hello world";
}
Du kannst das natürlich in beliebigen Datenstrukturen speichern:
my @sub_array = (\&test,\&test2);
my $subref = $sub_array[0];
$subref->();
sub test {
print "hello world";
}
User since
2007-05-11
923
Artikel
HausmeisterIn
Also in Arrays und Hashes kann man Referenzen auf Arrays und Hashes und jeden anderen Mist (auch funktionen) ablegen. Das ist in
perlreftut beschrieben, und in
perlref noch ein bisschen ausführlicher.
Und Referenzen auf Funktionen gibts auch:
my $hello = sub { print "hi there" };
sub other_hello {
print "hello again\n";
}
my $other = \&other_hello;
User since
2008-07-23
11
Artikel
BenutzerIn
Hi,
danke wiederum für die schnellen Antworten.
Ist genau das was ich gesucht habe (und die Beispiele sind klasse!).
Aber ich hätte da noch Ergänzungsfrage ;-)
Beispiel von renee:
1: my @sub_array = (\&test,\&test2);
2:
3: my $subref = $sub_array[0];
4: $subref->();
5:
6: sub test {
7: print "hello world";
8: }
wenn eine sub einen rückgabewert hat, würde das so aussehen
(bei Verwendung von Referenzen)?:
$rc = $subref->();
weil bei einer einfachen sub geht das ja so:
$rc = subname($par_1, $par_2);
Oder wie funktioniert die Auswertung des Rückgabewertes?
Danke nochmal..hilft echt weiter
Gruss
Ens
...der immer mehr Spass an Perl findet ;-)
Quotewenn eine sub einen rückgabewert hat, würde das so aussehen
(bei Verwendung von Referenzen)?:
$rc = $subref->();
weil bei einer einfachen sub geht das ja so:
$rc = subname($par_1, $par_2);
Ist vollkommen richtig.
@ret = $subref->( @param ); Oder eben mit nur einem Rückgabewert:
$rc = $subref->( @param );
MfG
User since
2008-07-23
11
Artikel
BenutzerIn
Hi,
Danke an alle für die Hilfe.
Thread kann geschlossen werden.
Gurr
Ens