Your comment in the spoiler made me think of this kind of an approach to
exploit the extra level of arrays:
use strict;
use warnings;
my @candidates = qw( Alice Bob );
## initialize each candidate with 0 votes
my %votes;
@votes{map lc, @candidates} = ( [0] ) x @candidates;
print "Available candidates: @candidates\n";
print "To cast a vote, type candidate's name. End the election with ^D
+\n";
## record the input vote
while (<>) {
chomp( my $vote = lc $_ );
if ( exists $votes{$vote} ) {
$votes{$vote}[0]++;
} else {
warn "Invalid candidate!\n";
}
}
## print all votes
print "Final results:\n";
printf "%10s : %d\n", $_, $votes{lc $_}[0]
for @candidates;
What it does wrong: