Slash Boxes
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
More | Login | Reply
Loading... please wait.
  • The code that throws that warning is in pad.c. Below is the code. I think the comment explains why the warning is being thrown. /* trying to capture from an anon prototype? */ if (CvCOMPILED(cv) ? CvANON(cv) && CvCLONE(cv) && !CvCLONED(cv) : *out_flags & PAD_FAKELEX_ANON) { if (warn && ckWARN(WARN_CLOSURE)) Perl_warner(aTHX_ packWARN(WARN_CLOSURE),
    • Yeah, I was also able to trace where in the *perl* code the warning was coming from, but I'm trying to figure out which *module* in the huge tree of modules being used is using a construct that is causing the warning to be thrown.

  • All I can offer is that during some recent attempts to refactor ExtUtils::ParseXS, I encountered this warning when attempting to make that module work under 'use strict'. IIRC, I got it in a part of the code that was using the "deferred regex evaluation" feature -- ??{ $some_variable } -- inside of itself.

    $bal = qr[(?:(?>[^()]+)|\((??{ $bal })\))*]; # ()-balanced

    $cast = qr[(?:\(\s*SV\s*\*\s*\)\s*)?]; # Optional (SV*) cast

    $size = qr[,\s* (??{ $bal }) ]x; # Third arg (to setpvn)


    • Thanks for the advice. I eventually tracked it down to Regexp::Common and was able to remove the warning if I just imported the number specific regexes:

        use Regexp::Common qw(number);

  • I've found success with the Carp::Always module. All I have to do is say "use Carp::Always" at the top of my program, and any time an exception is thrown it includes a stack trace, which is great for diagnosing all the exceptions from 'use strict' or 'use warnings fatal'. That said it /may/ not be compatible with other attempts to override the signal handlers. I now make it common practice to put "use Carp::Always" at the top of all my module t/*.t files.

    • I hope using -MCarp::Always on the command line has the same effect as editing use Carp::Always; into the code?
      • I found that the effects of 'use Carp::Always' are global in scope, so I assume that loading it with -M on the command line will work as well as placement into code.