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.
DWIM is Perl's answer to Gödel
|