<div dir="ltr"><div class="gmail_quote">On Sun, Sep 11, 2011 at 4:00 PM, Chanan Berler <span dir="ltr">&lt;<a 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&#39;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 &quot;please look into this key, and then that key, and then this index number for the value&quot; and then using some parser (or writing your own) that is able to understand it. This is what&#39;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&#39;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 = (&#39;Tie::StdHash&#39;);<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 &#39;HASH&#39; ) {<br>            return defined $next ? iterate( $object-&gt;{$next}, @paths ) : $object;<br>

        } elsif ( ref $object eq &#39;ARRAY&#39; ) {<br>            return defined $next ? iterate( $object-&gt;[$next], @paths ) : $object;<br>        } <br><br>        if ( $next &amp;&amp; ! ref $object ) {<br>            die &#39;Unsupported reference type: &#39; . ref $object;<br>

        }<br><br>        return $object;<br>    }<br><br>}<br><br><br>my %hash;<br>tie %hash, &#39;NewHash&#39;;<br><br>%hash = (<br>    key1 =&gt; {<br>        key2 =&gt; [ &#39;val&#39; ],<br>    },<br>);<br><br>my $location = &#39;key1/key2/0&#39;;<br>

print $hash{$location}; # prints &#39;val&#39;<br><br>print $hash{&#39;key1&#39;}; # prints { key2 =&gt; [&#39;val&#39;] }<br>print $hash{&#39;key1/key2&#39;}; # prints [&#39;val&#39;]<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&#39;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>