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 %flowOptions; print "Enter the number you would like to edit > "; chomp (my $choice = uc ); if (exists $dataOptions{$choice}) { print "Please enter the ", $dataOptions{$choice}[1], ' '; chomp ($servers[-1]{$dataOptions{$choice}[0]} = ); $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[$serverIndex]{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; }