Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
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 ( [id://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?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (6)
As of 2024-04-25 10:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found