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"; #### ph1 ph2 ph3 25 t3 t47 t48 t49 t50 d4 d5 d6 #### use strict; use warnings; use feature qw/ say /; use Parse::Range qw/ parse_range /; say parse_range( $string ); #### non-numeric range: 'ph1-3;25;t3;t47-t50;d4-6' at C:/strawberry/perl/site/lib/Parse/Range.pm line 7. ph1 ph2 ph3 25 t3 t47 t48 t49 t50 d4 d5 d6