my %hash = ( a => ['15-19',30,35,120], b => ['15-17','30-35',40], c => ['15-18',30,35,120], ); for (values %hash) { @$_ = map {/^(\d+)-(\d+)$/ ? ($1..$2) : $_} @$_; } use Data::Dumper; print Dumper(\%hash); #### for (values %hash) { @$_ = map {!/^(\d+)-(\d+)$/ ? $_ : ($1 < $2) ? ($1..$2) : reverse ($2..$1)} @$_; }