use v5.10;
use warnings;
my %ACTION = (
start => sub{ say "starting @_"; },
stop => sub{ say "stopping @_"; },
restart => sub{ say "restarting @_"; },
connect => sub{ say "connecting @_"; },
disconnect => sub{ say "disconnecting @_"; },
reconnect => sub{ say "reconnecting @_"; },
login => sub{ say "login to @_"; },
logout => sub{ say "logout from @_"; },
logoutall => sub{ say "logoutall on @_"; },
ping => sub{ say "pinging @_"; },
stat => sub{ say "stat'ing @_"; },
status => sub{ say "status of @_"; },
);
my %MACHINE = qw<
leibnitz ssh://vax011.example.com
descartes ssh://filesys.example.com
newton afp://macserver.example.org
heidegger ssh://nexus.example.com
pascal afp://macpro88.example.org:8088
them ssh://remote.example.com
us ssh://local.example.com
>;
my $machine_command = do{
use Regexp::Grammars;
qr{
<Command>
<rule: Command>
<Action> <Machine_name>
<rule: Action>
start | stop | restart
| connect | disconnect | reconnect
| login | logout | logoutall
| ping | status | stat
<rule: Machine_name>
leibnitz
| descartes
| newton
| heidegger
| pascal
}xms
};
use IO::Prompter;
while (my $input = prompt) {
if ($input =~ $machine_command) {
my $handler = $ACTION{ $/{Command}{Action} };
my $device = $MACHINE{ $/{Command}{Machine_name} };
$handler->($device);
}
else {
say "Don't know how to $input";
}
}