use Regexp::Common qw /number/; # GOAL: # have $1 contain everything but the leading "0:" # and the trailing ",$intOrFloat" ... in this case ",4.00" $_ = "0:20,1.00,g,1.00;65,4.00,g,4.00"; /0:(.+),($RE{num}{int}|$RE{num}{real})/ and warn $1; # SUBGOAL: # $1 contains a series of triplets separated by semicolons # Each triplet consists of price,quantity,unit_of_measure # The goal is to create an array of hashrefs with this data: # { price => ..., quantity => ..., unit_of_measure => ... }