Since I've recently learned what a dispatch table is.. (or rather, what I used is one..) I'm wondering if theres a better way to do this, or if anyone has any ideas for improvement..

What I've got is a console programm in which the user can enter a number of commands, and commands can be added to the list using modules.
The structure holding the commands looks like this:

sub init_commands { # Fill %Commands hash for parsecommands # %Commands{commandname}{pattern} = # %Commands{commandname}{function} = ['modulename', [['name', numb +er of arguments]] # %Commands{commandname}{syntax} = $Commands{'log'}->{'pattern'} = '^log (.*)$'; $Commands{'log'}->{'function'} = ['', ['createlog', 1]]; $Commands{'log'}->{'syntax'} = 'log <filename> <new/append>'; $Commands{'modules saveall'}->{'pattern'} = '^modules saveall$'; $Commands{'modules saveall'}->{'function'} = ['', ['savemodules', +0]]; $Commands{'modules saveall'}->{'syntax'} = 'modules saveall'; $Commands{'modules loadall'}->{'pattern'} = '^modules loadall ([\w +\.]+)$'; $Commands{'modules loadall'}->{'function'} = ['', ['loadmodules', +1]]; $Commands{'modules loadall'}->{'syntax'} = 'modules loadall <filen +ame>'; ... and so on.. }
The wonderful code for using this looks like this:
while( my ($command, $params) = each %Commands) { # debug("parselocalcommand: Command: $command\n"); if(substr($data, 0, length($command)) eq $command) { my $pattern = $params->{'pattern'}; if(my @res = $data =~ $pattern) { if($#+ == $params->{'function'}[1][1]) { my $answer; if($params->{'function'}[0] eq '') { $answer = &{$params->{'function'}[1][0 +]}(@res); } else { $answer = modulemethod($params->{'func +tion'}[0], $params->{'func +tion'}[1][0], @res); } if($answer) { printandprompt($answer); last; } } } else { printandprompt("Syntax: #" . $params->{'syntax +'} . "\n"); } } }
I'm currently planning to use this thing again (or something simliar) in another programm, which is why I'm asking..

C.


In reply to Complex dispatch table by castaway

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.