http://qs321.pair.com?node_id=925981

metaperl has asked for the wisdom of the Perl Monks concerning the following question:

I'm surprised there arent plenty of nodes of info on matching any type of number. But anyway, my problem has 2 steps

GOAL 1

# have $1 contain everything but the leading "0:" # and the trailing ",$intOrFloat" ... in this case ",4.00" # http://search.cpan.org/~nwclark/perl-5.8.3/pod/perlretut.pod $intOrFloat = qr/^[+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$/; $_ = "0:20,1.00,g,1.00;65,4.00,g,4.00"; /0:(.)+,$intOrFloat/ and warn $1;
# (for some reason $intOrFloat is not matching)

GOAL 2

# $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 => ... }

Replies are listed 'Best First'.
Re: Match integer or floating point numbers, then parse triplets
by Corion (Patriarch) on Sep 14, 2011 at 19:11 UTC

    Maybe you want to use a CSV parser instead? Text::CSV_XS?

    Also, (.)+ does not do what you seem to think it does. Maybe (.+) does more of what you want?

      $intOrFloat = qr/^[+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$/;

      metaperl:
      Also note that the definition of  $intOrFloat given in the OP requires that the integer or float be the only thing in the string (i.e., it must start at the start  ^ and end at the  $ end), and the example string given in the OP
          $_  = "0:20,1.00,g,1.00;65,4.00,g,4.00";
      and the pattern used to match it
          /0:(.)+,$intOrFloat/
      both have other stuff at the start.

      Update: metaperl: Good luck with your homework assignment.

Re: Match integer or floating point numbers, then parse triplets
by metaperl (Curate) on Sep 14, 2011 at 20:04 UTC

      "The cake is a lie."

      True laziness is hard work