Oops, I misplaced the final closing parenthesis in the regex.  But it doesn't 
seem to matter.

- - - - -

#!/usr/bin/perl

use warnings;
use strict;
use feature ":5.10";

#
# $line, unless empty, should contain one or more white-space-separated
# expressions of the form
#       FOO
# or    BAZ = BAR
# 
# We need to parse them and set
# $param{FOO} = 1       # default if value is omitted
# $param{BAZ} = 'BAR'
#
# Valid input example:
#   MIN=2 MAX = 12  WEIGHTED TOTAL= 20
# $param{MIN} = '2'
# $param{MAX} = '12'
# $param{WEIGHTED} = 1
# $param{TOTAL} = '20'
#

my $line = 'min=2 max = 12 weighted total= 20';
$line = 'min=2 max, = 12 weighted total= 20';
say $line;
my %param;

if ( $line and
     ($line !~
           s/
                \G            # Begin where prev. left off
                (?:           # Either a parameter...
                    (?:            # Keyword clause:
                        (\w+)      # KEYWORD (captured $1)
                        (?:        # Value clause:
                            \s*    #
                            =      # equal sign
                            \s*    #
                            (\w+)  # VALUE (captured $2)
                        )?         # Value clause is optional
                    )
                    \s*            # eat up any trailing ws
                )             ### <-- moved
                |             # ... or ...
                    $         # End of line.
            /                 # use captured to set %param
                $param{uc $1} = ( $2 ? $2 : 1 ) if defined $1;
       /xeg
   ) ) {
    say "Syntax error: '$line'";
    while (my ($x, $y) = each %param) {say "$x='$y'";}
    exit;
}
while (my ($x, $y) = each %param) {say "$x='$y'";}



--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to