Schrift
[thread]12245[/thread]

Statemachine in Perl - wie?



<< >> 6 Einträge, 1 Seite
Ensretted
 2008-07-24 19:05
#112640 #112640
User since
2008-07-23
11 Artikel
BenutzerIn
[default_avatar]
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
renee
 2008-07-24 19:11
#112641 #112641
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
"Mehrdimensionale" Arrays:

Code (perl): (dl )
1
2
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:

Code (perl): (dl )
1
2
3
4
5
6
7
my $subref = \&test;

$subref->(); # test ausführen

sub test {
    print "hello world";
}


Du kannst das natürlich in beliebigen Datenstrukturen speichern:

Code (perl): (dl )
1
2
3
4
5
6
7
8
my @sub_array = (\&test,\&test2);

my $subref = $sub_array[0];
$subref->();

sub test {
    print "hello world";
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
moritz
 2008-07-24 19:12
#112642 #112642
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
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:

Code: (dl )
1
2
3
4
5
6
my $hello = sub { print "hi there" };

sub other_hello {
print "hello again\n";
}
my $other = \&other_hello;
Ensretted
 2008-07-24 20:00
#112647 #112647
User since
2008-07-23
11 Artikel
BenutzerIn
[default_avatar]
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 ;-)
Gast Gast
 2008-07-24 20:28
#112650 #112650
Quote
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);

Ist vollkommen richtig. @ret = $subref->( @param ); Oder eben mit nur einem Rückgabewert: $rc = $subref->( @param );

MfG
Ensretted
 2008-07-25 09:40
#112677 #112677
User since
2008-07-23
11 Artikel
BenutzerIn
[default_avatar]
Hi,

Danke an alle für die Hilfe.

Thread kann geschlossen werden.

Gurr
Ens
<< >> 6 Einträge, 1 Seite



View all threads created 2008-07-24 19:05.