use strict; use warnings; my @p = (1.5, 2.5, 3.5 ); my @m = (0.5, 0.55, 0.60); sub calc { my $i = shift || 1; my $idx = ord(shift)-65; return $m[$idx] * ($p[$idx]**$i); } for my $str (qw/2A2B2C 4AC ABC BC/) { my $res = 1; while ($str =~ /(\d)?([A-Z])/g) { $res *= calc($1, $2); } print "$str = $res\n"; }