in reply to Loosing variable content after regular expression

Anonymous Monk is right, this most likely has something to do with what $l_Name_ref refers to. Most likely, this is a capture variable that then gets reset by the next match operation:

#!perl -w sub foo { my( $ref )= @_; print "Before match: <$$ref>\n"; 'barring something else' =~ /bar/; # reset all capture variables print "After match: <$$ref>\n"; }; 'blargh foo blargh' =~ /(foo)/; foo( \$1 ); print "Attempt 2:\n"; 'blargh foo blargh' =~ /(foo)/; foo( \"$1" ); __END__ Before match: <foo> Use of uninitialized value in concatenation (.) or string at q:\tmp.pl + line 7. After match: <> Before match: <foo> After match: <foo>

I doubt that the intent is really to pass around a reference to $1, as that has the described side effects. It's likely better to pass a reference to a copy of $1, as in Attempt 2.

Replies are listed 'Best First'.
Re^2: Loosing variable content after regular expression
by metty (Initiate) on Dec 19, 2014 at 08:39 UTC

    Excellent explanation! You can see the buggy code causing my problem in an answer above. Your example explains this phenomena short and precise. Thank you.

      In general, it's a Good Idea to "capture the capture variables" immediately after a match in order to avoid these kinds of strange problems:

      if ($string =~ m{ (foo|bar) (\d+) (w[ia]g) }xms) { my ($one, $two, $three) = ($1, $2, $3); do_something_with($one); ... }
      or:
      if (my ($one, $two, $three) = $string =~ m{ (foo|bar) (\d+) (w[ia]g) } +xms) { do_something_with($one); ... }