%normalise_with_this = ( 15 => { 00 => [ 0 .. 14 ], 15 => [ 15 .. 29 ], 30 => [ 30 .. 44 ], 45 => [ 45 .. 59 ] }, 30 => { 00 => [ 0 .. 29 ], 30 => [ 30 .. 59 ] } ); &dofunc("200504250946",15); sub dofunc { my ($interval, $pos) = @_; $min = substr($interval,10,2); foreach $v (keys %{$normalise_with_this{$pos}}) { for (@{$normalise_with_this{$pos}{$v}} ) { print $v if grep /$min/,$_; } } }