David Gray wrote:
> 
> > Thank you, John. This code does exactly what I want. Problem
> > is, I only understand about 30% of what's going on. I can
> > figure out the use of the hash, some of the pattern matching
> > & $1/$2. But can someone elaborate on:
> >
> > @keys{ qw/P ST U SL D/ } = \( $Proc, $Start, $Url, $Sleep, $Drive );
> 
> This is a shortcut for defining the values of a hash -- it creates
> $keys{P} == $Proc, $keys{ST} == $Start, etc.

$keys{P} = \$Proc, $keys{ST} = \$Start, etc.


> > /(\S+)=(.+?)(?=\s+\S+=|\z)/g
>     ^^^   ^^^ ^^^   ^^^^
>      1     2   3      4
> 
> 1) match one or more non-whitespace characters, followed by a literal
> '='
> 
> 2) match one or more anythings, non-greedy
> 
> 3) a "zero-width positive look-ahead assertion" (check out perldoc
> perlre for more info on this, basically checks that a pattern exists
> ahead of what you're currently examining in your regex)
> 
> 4) this part doesn't make sense to me -- I would think it should be:
> 
> (?=\s+=|\z)
> 
> instead... I see no cases where there would be any whitespace after your
> parameter list is finished, and between, for example, 'ST' and '=',
> which is what this sequence allows for...

>From the OP's post, the data is:

q[P=IcwRcsm D=D: SL=20 ST=d:\icw\rcsm\StartSv.bat Parm1 Parm2 U=http://uslv...];

/(\S+)=(.+?)(?=\s+\S+=|\z)/g  will match:
(P)=(IcwRcsm)(?= D=)
(D)=(D:)(?= SL=)
(SL)=(20)(?= ST=)
(ST)=(d:\icw\rcsm\StartSv.bat Parm1 Parm2)(?= U=)
And finally:
(U)=(http://uslv...)(?=\z)

The (?=\s+\S+=) pattern ensures that the data captured in $2 has
no trailing whitespace.


> > ${$keys{uc $1}} = $2;
> 
> First of all, $1 and $2 are automatic variables set by backreferences in
> the previously evaluated regular expression, the one discussed above.
> The 'uc $1' part makes sure that whatever characters are in $1 are
> uppercase. It's then read as: take the variable named $keys{uc $1} and
> set it to $2. Check out perldoc perlref for more information about this,
> especially the section titled: 'Using References'.
> 
> After the code is executed, you'd end up with:
> 
> $P == 'IcwRcsm D=D:    '
> $SL == '20 ST=d:\icw\rcsm\StartSv.bat'

Wrong.  Run the code I posted and see for yourself.


John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to