This queue is for tickets about the Regexp-Grammars CPAN distribution.

Report information
The Basics

Nobody in particular
KENTNL [...]

(no value)
Broken in:
Fixed in:
(no value)

Subject: $MATCH var no longer visible in grammar syntax

Take this otherwise slightly contrived code:


use strict;
use warnings;

use Regexp::Grammars;
my $grammar = qr{
        <MATCH=(?{ join q[], @{$MATCH} })>

use Data::Dumper qw(Dumper);
if( q["helloworld"] =~ $grammar ) {
  print Dumper( \%/ );


On 1.042 , this code executes as expected without error.

On 1.043, this code fails with


Global symbol "$MATCH" requires explicit package name (did you forget to declare "my $MATCH"?) at /tmp/ line 10.


Explicitly declaring "our $MATCH" before the `my $grammar` does indeed resolve the issue, but it was not documented in 1.043's changes that this was to be expected.


If I had to guess why its not working as expected, I'd say the change to using `` to create those vars may be importing them into the wrong package.

( seeing uses caller() and not compile-context, , and given I cant see anything that would change what caller reported in R:G:import



Attached is a simple test that tests that Regexp::Grammars can see any of the MATCH variables, and it fails all of them on 1.043 and passes all of them on 1.042
Subject: regx_grammars.t
use strict; use warnings; # ABSTRACT: Test Regexp::Grammars exports package symbols. use Regexp::Grammars; use Test::More; sub has_var { my ($varname) = @_; local $@; eval <<"EOF"; my \$grammar = qr{<MATCH=(?{ $varname })>} EOF note $@ if $@; return !$@; } for my $varname (qw( $CAPTURE $CONTEXT $DEBUG $INDEX $MATCH %ARG %MATCH )) { ok( has_var($varname), "Has $varname" ); } done_testing;
Attached is the simplest patch that might work, and does, and other tests continue passing.
Subject: grammars.patch
--- lib/Regexp/ 2015-12-15 23:29:46.000000000 +1300 +++ lib/Regexp/ 2015-12-15 23:30:36.997096571 +1300 @@ -63,7 +63,9 @@ # Sanctify the standard Regexp::Grammars pseudo-variables from # Perl 5.18's early enforcement of strictures... - vars->import( '$CAPTURE', '$CONTEXT', '$DEBUG', '$INDEX', '$MATCH', '%ARG', '%MATCH' ); + eval q[package ] . [ caller() ]->[0]. q[; + vars->import( '$CAPTURE', '$CONTEXT', '$DEBUG', '$INDEX', '$MATCH', '%ARG', '%MATCH' ); + ]; warnings->unimport('once'); } }
Thanks for the report, and more especially for the test file and the patch. I've just uploaded a new release that uses a variation on your fix, and seems to solve the problem. Please let me know if you find otherwise. Very much appreciated, Damian

This service runs on Request Tracker, is sponsored by The Perl Foundation, and maintained by Best Practical Solutions.

Please report any issues with to