On Mar 17, 2011, at 5:21 PM, Rob Dixon wrote:

> A s///g is 'successful' if it performs at least one substitution, in which 
> case it will return the number of substitutions made. In your code, it will 
> find as many key=value substrings as possible and replace them with just the 
> value string.
> 
> The \G pattern is documented only in the case of m//g, which makes sense as 
> it is defined in terms of a character position (pos) within the string where 
> the last match ended. If a substitution is being made then it will also 
> affect character positions, and so is similar to adding to or deleting from 
> an array while iterating over it.
> 
> It is bad form to use the /e modifier to generate side-effects (just as it is 
> wrong to do so with the map operator).

All very useful info - thanks.

> I believe a while loop is the proper way to go, but if you want to experiment 
> with m//g I suggest something like this
> 
>  my %matches = $line =~ /\G\s*(\w+)(?:\s*=\s*(\w+))?\s*/gc;
> 
> which will pass all the 'key' and 'key=value' pairs to %matches. An invalid 
> input will cause the match to terminate before the end of the string, so
> 
>  if (pos $line < length $line) {
>    # code to handle bad input
>  }
> 
> If a key has no corresponding value in the string it will appear in the hash 
> with a value of undef, which should be defaulted to 1 like this
> 
>  foreach (values %matches) {
>    $_ = 1 if not defined;
>  }
> 
> I hope that helps a little.

It helped a lot.  At this point I'd agree that the while loop is the most 
straightforward approach.

Thanks again.

Chap


--
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