Yes, yes and yes. Consider:
use strict;
use warnings;
my @servers;
my %dataOptions = (
1 => ['server', 'Server Name:', 1],
2 => ['dbType', 'Database Type:', 0],
3 => ['location', 'Server Location:', 0],
4 => ['function', 'Server Function:', 0],
5 => ['ip', 'Server IP:', 1],
);
my %flowOptions = (
A => 'Add Another Server',
C => 'Continue',
D => 'Done',
);
my %byType;
addServer (\@servers);
while (1) {
#system ("clear");
printf " (%s) %s%-20s %s\n",
$_,
$dataOptions{$_}[2] ? '*' : ' ',
@{$dataOptions{$_}}[1],
$servers[-1]{$dataOptions{$_}[0]},
for sort keys %dataOptions;
print '-' x 30, "\n";
printf " (%s) %s\n", $_, $flowOptions{$_} for sort keys %flowOpti
+ons;
print "Enter the number you would like to edit > ";
chomp (my $choice = uc <STDIN>);
if (exists $dataOptions{$choice}) {
print "Please enter the ", $dataOptions{$choice}[1], ' ';
chomp ($servers[-1]{$dataOptions{$choice}[0]} = <STDIN>);
$byType{$dataOptions{$choice}[0]}{$#servers} = 1;
} elsif (! exists $flowOptions{$choice}) {
next;
}
last if $choice eq 'D';
# Can't add another unless all required data supplied for current
+entry
next if missingOptions (\%dataOptions, $servers[-1]);
addServer (\@servers);
}
# Remove bogus last entry
pop @servers if missingOptions (\%dataOptions, $servers[-1]);
# later in the code
for my $server (@servers){
print "Server $server->{server}\n";
}
for my $serverIndex (sort keys %{$byType{ip}}) {
print "Server $servers[$serverIndex]{server}: $servers[$serverInde
+x]{ip}\n";
}
sub addServer {
my ($servers) = @_;
push @$servers, {}; # Add a new entry
$servers->[-1]{$dataOptions{$_}[0]} = '' for keys %dataOptions;
}
sub missingOptions {
my ($options, $data) = @_;
my @missing =
grep {$options->{$_}[2] && ! length $data->{$options->{$_}[0]}
+}
keys %$options;
return @missing;
}
True laziness is hard work
|