Stories
Slash Boxes
Comments
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

use Perl Log In

Log In

[ Create a new account ]

Ovid (2709)

Ovid
  (email not shown publicly)
http://publius-ovidius.livejournal.com/
AOL IM: ovidperl (Add Buddy, Send Message)

Stuff with the Perl Foundation. A couple of patches in the Perl core. A few CPAN modules. That about sums it up.

Journal of Ovid (2709)

Thursday May 05, 2005
07:51 PM

Funky Regex Problem

[ #24559 ]

To make a long story short, I can't figure out why this is failing (I'm trying to force the regex to fail if it matches a single dot):

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

use Regexp::Common;

use constant SUCCEED => qr{(?=)};
use constant FAIL    => qr{(?!)};

my $QUOTED = $RE{quoted};
my $NUM    = $RE{num}{real};

my $VALUE  = do {
    use re 'eval';
    qr/(?:$QUOTED|$NUM)(??{'.' eq $+ ? FAIL : SUCCEED})/;
};

my $text = 'name => "foo", fav.num => 3';
my @text = split /($VALUE)/ => $text;
print Dumper \@text;

That prints:

$VAR1 = [
  'name => ',
  '"foo"',
  ', fav',
  '.',
  'num => ',
  '3'
];

What I want it to print is:

$VAR1 = [
  'name => ',
  '"foo"',
  ', fav.num => ',
  '3'
];

Any ideas?

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • my $VALUE  = do {
        use re 'eval';
        qr/(?>($QUOTED|$NUM))(??{'.' eq $^N ? FAIL : SUCCEED})/;
    };

    my $text = 'name => "foo", fav.num => 3';
    my @text = split /$VALUE/ => $text;
    print Dumper \@text;
    • Very interesting. I suspect it would take me a while to debug, but I've discovered that while this passes my test case wonderfully, it fails miserably when using that in the Lexer.pm [plover.com] example from HOP. My test case is clearly not representing the problem as well as I thought since others are having this problem on the Perlmonks site.

  • Do you really need a deferred pattern there? I’d write it like so:

    qr/(?:$QUOTED|$NUM)(?(?{ '.' eq $+ })$FAIL)/;

    (which of course implies variables rather than constants.)

    Now given that, you get a zero-length match:

    $VAR1 = [
              'name => ',
              '"foo"',
              ', fav',
              '',
              '.num => ',
              '3'