use strict; use warnings; my %p = (A => 2.74, B => 2.64, C => 2.5); my @range = (50,55,60,65,70,75,80,85,90); while(my $str = ){ chomp($str); print "\nInput : $str\n"; $str =~ s/(\d+)(\w)/($2 . '*') x $1/eg; $str =~ s/(\w)(\w)/$1 . '*' . $2 . '*' /eg; $str =~ s/(?!\*)$/*/; $str =~ s/(.)\*(?!\1)/"$1\*\(".$range[ord($1) - 65]."\/100\)\*"/eg; $str =~ s/\*+$//; $str =~ s/$_/$p{$_}/g for (keys %p); print "Expression: ".$str ."\n"; print "Output : ",eval$str ,"\n\n"; } __DATA__ 4ABC 2A2B2C 3C ABC Output is: Input : 4ABC Expression: 2.74*2.74*2.74*2.74*(50/100)*2.64*(55/100)*2.5*(60/100) Output : 61.38045890064 Input : 2A2B2C Expression: 2.74*2.74*(50/100)*2.64*2.64*(55/100)*2.5*2.5*(60/100) Output : 53.96012424 Input : 3C Expression: 2.5*2.5*2.5*(60/100) Output : 9.375 Input : ABC Expression: 2.74*(50/100)*2.64*(55/100)*2.5*(60/100) Output : 2.98386