in reply to Regex capture consumed by non-capturing match
We tell the children and we tell the children: use strict; use warnings;. In this case turning on warnings generates a whole bunch of
Use of uninitialized value in concatenation (.) or string at noname1.p +l line 23.
warnings. A clue perhaps? Indeed, an unsubtle clue! A hit you about the ears and do something clue. First thing to notice is that all the warnings are in trim_end, so remove trim_start and try again - same result. Ok, remove some cruft and the code looks like:
use strict; use warnings; my $test = 'abc , def'; $test =~ /([\s\w]+),([\s\w]+)/; for ($1, $2) { my $string = $_; $string =~ s/\s+\z//ms; print "$string\n"; }
and generates (omitting the warnings):
abc
Now look at what the code does. It performs a regular expression match setting $1 and $2. It then (in the loop) performs two more matches where the first fails and the second sees an undefined value. At this point it is worth noting from perlre that:
The numbered match variables ($1, $2, $3, etc.) and the related punctuation set ($+, $&, $`, $', and $^N) are all dynamically scoped until the end of the enclosing block or until the next successful match, whichever comes first.
but the first match in the loop is successful so $2 goes out of scope - becomes undefined. Capeesh?
Remember: use those strictures.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Regex capture consumed by non-capturing match
by erroneousBollock (Curate) on Jul 20, 2007 at 00:29 UTC | |
by ribasushi (Pilgrim) on Jul 20, 2007 at 15:55 UTC | |
by ikegami (Patriarch) on Jul 20, 2007 at 16:29 UTC | |
|
Re^2: Regex capture consumed by non-capturing match
by ribasushi (Pilgrim) on Jul 20, 2007 at 16:00 UTC | |
by GrandFather (Saint) on Jul 20, 2007 at 21:28 UTC |