Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Can't figure out why capture group is not output by substitution regex

by nysus (Parson)
on Aug 24, 2020 at 15:12 UTC ( #11121035=perlquestion: print w/replies, xml ) Need Help??

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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://11121035]
Approved by Corion
Front-paged by haukex
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (3)
As of 2021-12-07 20:58 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    R or B?



    Results (34 votes). Check out past polls.

    Notices?