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.
In reply to Re: Regex capture consumed by non-capturing match
by GrandFather
in thread Regex capture consumed by non-capturing match
by ribasushi
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |