http://www.perlmonks.org?node_id=11121035

nysus has asked for the wisdom of the Perl Monks concerning the following question:

I got this:

#! /usr/bin/env perl use strict; use warnings; my $here = <<HERE; before text more text ### hjh jh ja jhjasdhf jh'j asdk kas dkjakdjf kasjd fkjasdkfj kajsdkjf kasjdf end ### after headline after text HERE $here =~ s/(^(#+)\s)(.*?)\g2/$2 . ' ' . $3 =~ s|\n||rg . $2/mse; print $here . "\n";

I expect this to be output:

before text more text ### hjh jh ja jhjasdhf jh'jasdk kas dkjakdjf kasjd fkjasdkfjkajsdkjf k +asjdf end ### after headline after text

Output I get:

Use of uninitialized value $2 in concatenation (.) or string at /Users +/me/perl/workshop/regex/tut.pl line 16. before text more text ### hjh jh ja jhjasdhf jh'jasdk kas dkjakdjf kasjd fkjasdkfjkajsdkjf k +asjdf end after headline after text

I can fix this by assigning $2 go a new scalar variable first and then using the new variable. But I'm not sure why I have to do that.

$PM = "Perl Monk's";
$MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest Vicar";
$nysus = $PM . ' ' . $MCF;
Click here if you love Perl Monks

Replies are listed 'Best First'.
Re: Can't figure out why capture group is not output by substitution regex
by hippo (Bishop) on Aug 24, 2020 at 15:49 UTC
    I'm not sure why I have to do that.

    You have to do it because your second (inner) s/// resets the capture groups.


    🦛

      Ah, of course. Thanks.

      $PM = "Perl Monk's";
      $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest Vicar";
      $nysus = $PM . ' ' . $MCF;
      Click here if you love Perl Monks

Re: Can't figure out why capture group is not output by substitution regex
by Eily (Monsignor) on Aug 24, 2020 at 15:57 UTC

    I can fix this by assigning $2 go a new scalar variable first and then using the new variable.
    Or simply $here =~ s/(^(#+)\s.*?\g2)/$1 =~ s|\n||rg/mse;

      Yes, much simpler. Thanks.

      $PM = "Perl Monk's";
      $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest Vicar";
      $nysus = $PM . ' ' . $MCF;
      Click here if you love Perl Monks