Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re^2: Regex in json: escaping forward slash

by mhearse (Hermit)
on Aug 22, 2012 at 21:25 UTC ( #989152=note: print w/ replies, xml ) Need Help??


in reply to Re: Regex in json: escaping forward slash
in thread Regex in json: escaping forward slash

#!/usr/bin/env perl use strict; use JSON; use Data::Dumper; my $contents = `cat progconfig.json`; my $config = JSON->new->decode($contents); print Dumper($config);


Comment on Re^2: Regex in json: escaping forward slash
Download Code
Re^3: Regex in json: escaping forward slash
by Mr. Muskrat (Abbot) on Aug 22, 2012 at 21:37 UTC

    That code doesn't exhibit the problem you are trying to solve. (It isn't trying to do anything that requires escaping the slashes.)

    Output:

    $VAR1 = { 'regex' => { '.*/home/members/index.htm.*' => { '404' => { ' +reporting' => '1000', ' +paging' => '2000' } } } };

    Even when I use that key as a regex, it works for me.

    #!/usr/bin/env perl use strict; use warnings; use JSON; use Data::Dumper; my $contents = `cat progconfig.json`; my $config = JSON->new->decode($contents); my $re = (keys %{$config->{regex}})[0]; print "re: $re\n"; my $path = '/some/fake/path/home/members/index.html'; if ( $path =~ /$re/ ) { print "$path matched regex\n"; }

    Output:

    re: .*/home/members/index.htm.* /some/fake/path/home/members/index.html matched regex

Re^3: Regex in json: escaping forward slash
by davido (Archbishop) on Aug 22, 2012 at 21:38 UTC

    But what's the problem? Maybe you could provide an example of how your code is failing to deal with '/' properly. In the following example I decode your sample JSON, grab the key that looks like a regular expression, compile it as a regular expression, and use it to perform a match.

    use strict; use warnings; use JSON; use constant KEY => 0; use constant VALUE => 1; my $json_string = <<'END_JSON'; { "regex" : { ".*/home/members/index.htm.*" : { "404" : { "reporting" : "1000", "paging" : "2000" } } } } END_JSON my @test_strings = qw( web/home/members/index.htm?garbage=bye /home/memberzzzz/index.htm?garbage=bye ); my $decoded_json = JSON->new->decode( $json_string ); # The regex is contained within a hash key. my $regex_string = (%{$decoded_json->{regex}})[KEY]; my $regex = qr/$regex_string/; foreach my $test_string ( @test_strings ) { if( $test_string =~ m/$regex/ ) { print "Bingo! [$test_string] matches the pattern '$regex_string'\n +"; } else { print "Boo! [$test_string] doesn't match the pattern '$regex_strin +g'\n"; } }

    No special escaping of '/' here. The qr// operator is convenient.


    Dave

      Thanks for your reply. I made a poor assumption. I was under the impression that:
      my $regex = ".*/home/members/index.htm.*"; if (/$regex/)
      Was the same as
      if (/.*/home/members/index.htm.*/)
      Which would fail. I was wrong!

        perlop (Gory Details of Parsing Quoted Constructs): "The most important Perl parsing rule is the first one discussed below: when processing a quoted construct, Perl first finds the end of that construct, then interprets its contents."

        m// is a quoted construct. So the "end" will be found before the contents are interpreted (including interpolated). Now if you say, "m/a/b/", the problem is that the end is found between 'a' and 'b'. But when you say, $c='/', and then m/a${c}b/, the end is found after 'b', and later the interpolation of $c takes place.


        Dave

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (5)
As of 2015-07-04 04:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (57 votes), past polls