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