use strict; use warnings; use Data::Dump qw/pp dd/; use 5.10.0; # ========= Tests my $set = Some::Module->new(qw(foo bar bat)); say $set->contains('fox'); # false say $set->contains('foo'); # true say $set->contains('FOO'); # true say $set->after('foo'); # 'bar' say $set->is_last('bar'); # false say $set->is_last('bat'); # true package Some::Module; use Data::Dump qw/pp dd/; sub new { my ( $class, @sequence ) = @_; my $pos = 0; my %positions = map { lc($_) => $pos++ } @sequence; my $count = @sequence; my $obj = { sequence => \@sequence, positions => \%positions, count => $count, last_pos => undef, }; bless $obj, $class; } sub contains { my ( $self, $key ) = @_; my $pos = $self->{positions}{lc($key)}; $self->{last_pos} = $pos; return defined $pos; } sub after { my ($self, $key) = @_; my $pos = $self->{positions}{lc($key)}; return $self->{sequence}[$pos+1]; } sub is_last { my ($self, $key) = @_; my $pos = $self->{positions}{lc($key)}; return $pos == $self->{count} -1; }