use strict; use warnings; use feature qw/say/; my $string = "ph1-3;25;t3;t47-t50;d4-6"; my @output = map { s/^([[:alpha:]]+)(\d+)-(\d+)/$1$2-$1$3/; my ( $low, $high ) = split /-/; $low .. $high || $low; } split /;/, $string; say "@output";