Right on! This is a much better way than I was considering.
"There is more than one way to do it"
Thanks,
Chris
-----Original Message-----
From: Michael Fowler
Sent: Tuesday, August 14, 2001 11:20 AM
To: Schooley, Chris
Cc: '
[email protected]'
Subject: Re: Command line interface
On Tue, Aug 14, 2001 at 10:54:05AM -0700, Schooley, Chris wrote:
Sorry, I should clarify - the program itself is like shell, has its own
commands, etc. It is intended to simulate the command line interface found
on various Cisco devices.
Based on this, I'm going to assume you have a set of commands that you're
checking thusly:
if ($command eq 'foo') {
do_foo();
} elsif ($command eq 'bar') {
do_bar();
} ...
What I typically do for problems like these is use a hash of hashes:
%commands = (
foo => {
sub => \&do_foo,
},
bar => {
sub => \&do_bar,
},
);
Then you simply do a lookup:
if ($commands{$command}) {
$commands{$command}{'sub'}->();
} else {
die("Unknown command name \"$command\".\n");
}
I use a hash of hashes, instead of a hash of name => subroutine pairs, so
that I can include other meta-data along with the command. For instance:
%commands = (
foo => {
sub => \&do_foo,
arguments => 2,
usage => '<arg1> <arg2>',
},
bar => {
sub => \&do_bar,
arguments => [0, 1],
usage => '[<optional arg1>]',
},
);
With this, you can do things like check the number of arguments specified
for the command, and if there aren't enough, or there are too many, print
out
a usage message.
Michael
--
Administrator www.shoebox.net
Programmer, System Administrator www.gallanttech.com
--