Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change

Re^4: Turning on regexp debugging at runtime

by Monk::Thomas (Friar)
on Sep 24, 2014 at 14:00 UTC ( #1101797=note: print w/replies, xml ) Need Help??

in reply to Re^3: Turning on regexp debugging at runtime
in thread Turning on regexp debugging at runtime


Are you aware you can scope more easily using

$str = "abc"; $re1 = qr/a/; $re2 = qr/b/; { use re 'debug'; $str =~ $re1; } $str =~ $re2;
However since the whole process does not seem to help you anyway: Can you please provide more code? It doesn't seem very useful to match like crazy but not doing anything with the match results.

Replies are listed 'Best First'.
Re^5: Turning on regexp debugging at runtime
by SBECK (Hermit) on Sep 24, 2014 at 17:34 UTC

    Your example doesn't work. The re pragma (as far as I can tell) does something when the regexp is created, so if I run your code, nothing is output.

    However, even if it was, this really doesn't do what I want. Imagine the following code:

    $re1 = qr/.../; $re2 = qr/.../; ... $reN = qr/.../; @str = ('some','list','of','strings'); foreach my $str (@str) { $str =~ /$re1/; $str =~ /$re2/; ... $str =~ /$reN/; }

    That's basically the situation that I have. But I don't want to turn on debugging for all regexps, or even for a single regexp every time it is used. What I want is to be able to debug $re2 when applied to the 5th string and nothing else.

    The way I want this to work is that I run this program in the debugger, step through until I get to the particular regexp match that I want to debug, and then I type "use re 'debug'" and I'm ready to go.

    Unfortunately, it doesn't work. The regexp was already created without debugging turned on, so (as far as I can tell), there is no way to turn it on for this one particular match.

    Anyway, as I said, it's far from the end of the world... I can turn on debugging and then run the script to the point i'm interested in and ignore all the unwanted debug output from all the other times the regexp was matched. This is mainly a convenience question.


      In that case, go ahead and recompile the regex in the debugger, like this:

      do { use re qw(Debug More); $re1=qr/g/; }

      We simply create a block and inside it, we turn on regex debug mode, and compile the regex.

      Here's the test run I did:

      $ cat use strict; use warnings; my $re1 = qr/p/; my $re2 = qr/t/; use re qw(Debug More); my @list = ('alpha', 'beta', 'gamma', 'delta'); for (@list) { print $_, "\n"; if (/$re1/) { print "has P\n" } if (/$re2/) { print "has T\n" } } $ perl -d <<< snip >>> main::( my $re1 = qr/p/; DB<1> s main::( my $re2 = qr/t/; DB<1> main::( my @list = ('alpha', 'beta', 'gamma', 'delta'); DB<1> main::( for (@list) { DB<1> main::( print $_, "\n"; DB<1> alpha main::( if (/$re1/) { print "has P\n" } DB<1> main::( if (/$re1/) { print "has P\n" } DB<1> has P main::( if (/$re2/) { print "has T\n" } DB<1> p { use re qw(Debug More); $re1=qr/g/; } Compiling REx "g" Final program: 1: EXACT <g> (3) 3: END (0) anchored "g" at 0 (checking anchored isall) minlen 1 DB<2> s main::( print $_, "\n"; DB<2> beta main::( if (/$re1/) { print "has P\n" } DB<2> Guessing start of match in sv for REx "g" against "beta" Did not find anchored substr "g"... Match rejected by optimizer main::( if (/$re2/) { print "has T\n" } DB<2> main::( if (/$re2/) { print "has T\n" } DB<2> has T main::( print $_, "\n"; DB<2>

      If you want to switch back and forth, then you may want another variable that you can use to hold the original (nondebug) version, so you can copy it back after you're done with the debug version.

      Note: As you can see, I originally intended to leave regex debugging on by doing so after compiling all the regexes. But it seems that it was optimized out, so that's why I had to wrap it during debugging. It may be easy to leave the regex engine in debug mode so you can avoid the do { } block, but once I had something that worked, I stopped.


      When your only tool is a hammer, all problems look like your thumb.

      Your example doesn't work.

      Uhm. Yes. I was aware of that. I just wanted to highlight that you don't need to 'reset' the lexical scoping by descending into another level if all you have to do is leave the scope.

      What I still don't get is why you are doing all this in the first place. Unless I'm missing something

      foreach my $str (@str) { $str =~ /$re1/; $str =~ /$re2/; ... $str =~ /$reN/; }
      doesn't do anything except wasting some CPU cycles to match strings and throw away the result. Maybe by giving us more information a cleaner solution can be found?

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1101797]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (2)
As of 2020-10-24 21:23 GMT
Find Nodes?
    Voting Booth?
    My favourite web site is:

    Results (247 votes). Check out past polls.