<html style="direction: ltr;">
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
    <style>body p { margin-bottom: 0cm; margin-top: 0pt; } </style>
  </head>
  <body style="direction: ltr;"
    bidimailui-detected-decoding-type="UTF-8" text="#000000"
    bgcolor="#FFFFFF">
    I think the popularity of JSON (and CSS/XPath selectors) has
    recently caused a bunch of people to think along these lines (i.e, a
    syntax for paths to query deeply nested data structures).<br>
    I'm much slower at writing code than Sawyer; however I bet I can
    find 3 more complete implementations of whatever I wanted to write
    on CPAN in less time than it would take me to pick a package name ;)<br>
    <a class="moz-txt-link-freetext" href="https://metacpan.org/module/JSON::Path">https://metacpan.org/module/JSON::Path</a><br>
    <a class="moz-txt-link-freetext" href="https://metacpan.org/module/Hash::Path">https://metacpan.org/module/Hash::Path</a><br>
    <a class="moz-txt-link-freetext" href="https://metacpan.org/module/Data::Path">https://metacpan.org/module/Data::Path</a><br>
    <br>
    On 09/11/2011 04:20 PM, sawyer x wrote:
    <blockquote
cite="mid:CAMvkq_RQVDg0AoQuOo4pW4d1+FmgMicemqkUYrvv2Sd_nT2wgA@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div class="gmail_quote">On Sun, Sep 11, 2011 at 4:00 PM, Chanan
          Berler <span dir="ltr">&lt;<a moz-do-not-send="true"
              href="mailto:bc.other@gmail.com">bc.other@gmail.com</a>&gt;</span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex;">
            is this better ?<br>
          </blockquote>
          <div class="h5"><br>
            No. Eval is bad! :)<br>
            <br>
            Imagine you send improper text that could be interpreted as
            actual code. Imagine someone else being able to send stuff
            to that service and sends something malicious. Imagine
            someone not knowing what they're suppose to send, and they
            just send commands.<br>
            <br>
            Instead, I suggest one of two options:<br>
            1. Using some form of syntax to say "please look into this
            key, and then that key, and then this index number for the
            value" and then using some parser (or writing your own) that
            is able to understand it. This is what's done in XPath, CSS
            selector paths, etc.<br>
            2. sending the data itself instead of sending a reference to
            where the data may be. I suggest JSON,<br>
            <br>
            I've gone ahead and written the 1st option, for fun:<br>
            #!/usr/bin/perl<br>
            use strict;<br>
            use warnings;<br>
            <br>
            {<br>
                package NewHash;<br>
                use Tie::Hash;<br>
            <br>
                our @ISA = ('Tie::StdHash');<br>
            <br>
                sub FETCH {<br>
                    my ( $object, $path ) = @_;<br>
                    my @paths = split /\//, $path;<br>
                    return iterate( $object-&gt;{ shift @paths }, @paths
            );<br>
                }<br>
            <br>
                sub iterate {<br>
                    my ( $object, @paths ) = @_;<br>
                    my $next = shift @paths if @paths;<br>
            <br>
                    if ( ref $object eq 'HASH' ) {<br>
                        return defined $next ? iterate(
            $object-&gt;{$next}, @paths ) : $object;<br>
                    } elsif ( ref $object eq 'ARRAY' ) {<br>
                        return defined $next ? iterate(
            $object-&gt;[$next], @paths ) : $object;<br>
                    } <br>
            <br>
                    if ( $next &amp;&amp; ! ref $object ) {<br>
                        die 'Unsupported reference type: ' . ref
            $object;<br>
                    }<br>
            <br>
                    return $object;<br>
                }<br>
            <br>
            }<br>
            <br>
            <br>
            my %hash;<br>
            tie %hash, 'NewHash';<br>
            <br>
            %hash = (<br>
                key1 =&gt; {<br>
                    key2 =&gt; [ 'val' ],<br>
                },<br>
            );<br>
            <br>
            my $location = 'key1/key2/0';<br>
            print $hash{$location}; # prints 'val'<br>
            <br>
            print $hash{'key1'}; # prints { key2 =&gt; ['val'] }<br>
            print $hash{'key1/key2'}; # prints ['val']<br>
            <br>
            -----<br>
            <br>
            This recurses over the path, and goes deeper for every
            result until it either finds the exact location or reaches a
            scalar, which should be the last location. It doesn't
            support SCALAR refs or CODE refs or Regexp refs, but it can
            be adapted to support them.<br>
            <br>
            The problem here is what if the key name contains a forward
            slash? Ah, the fallacy of simple parsing. :)<br>
            <br>
            Good luck.<br>
            S.<br>
          </div>
        </div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
Perl mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Perl@perl.org.il">Perl@perl.org.il</a>
<a class="moz-txt-link-freetext" href="http://mail.perl.org.il/mailman/listinfo/perl">http://mail.perl.org.il/mailman/listinfo/perl</a></pre>
    </blockquote>
    <p><br>
    </p>
  <br />-- 
<br />This message has been scanned for viruses and
<br />dangerous content by
<a href="http://www.mailscanner.info/"><b>MailScanner</b></a>, and is
<br />believed to be clean.
</body>
</html>