use warnings; use strict; package PhaseManager; sub new { my ($class, @phases) = @_; my %phaseHash = map {lc($phases[$_]) => lc($phases[$_ + 1] || '')} 0 .. $#phases; return bless \%phaseHash, $class; } sub Next { my ($self, $phase) = @_; die "Unknown phase '$phase'" if !exists $self->{lc $phase}; return $self->{lc $phase}; } package main; my $manager = PhaseManager->new (qw'first second last'); my @testPhases = qw'first Second LAST FUBAR'; for my $currPhase (@testPhases) { my $nextPhase = $manager->Next($currPhase) || ''; print "Phase '$currPhase' goes to '$nextPhase'\n"; } #### Phase 'first' goes to 'second' Phase 'Second' goes to 'last' Phase 'LAST' goes to '' Unknown phase 'FUBAR' at D:\Delme~~\PerlScratch\delme.pl line 17.