Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

Re^5: Turning on regexp debugging at runtime

by SBECK (Hermit)
on Sep 24, 2014 at 17:34 UTC ( #1101840=note: print w/replies, xml ) Need Help??

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

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.

Replies are listed 'Best First'.
Re^6: Turning on regexp debugging at runtime
by roboticus (Chancellor) on Sep 24, 2014 at 20:28 UTC


    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.

Re^6: Turning on regexp debugging at runtime
by Monk::Thomas (Friar) on Sep 25, 2014 at 07:43 UTC

    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://1101840]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (5)
As of 2020-08-10 21:24 GMT
Find Nodes?
    Voting Booth?
    Which rocket would you take to Mars?

    Results (58 votes). Check out past polls.