Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re^3: How to get a reference from an eval() string?

by haukex (Archbishop)
on Sep 07, 2016 at 12:43 UTC ( [id://1171313]=note: print w/replies, xml ) Need Help??


in reply to Re^2: How to get a reference from an eval() string?
in thread How to get a reference from an eval() string?

Hi exilepanda,

Only I thought that would be some build in perl func or syntactical trick can do the job. Seem there should be no simple direct way to do that now.

Well sure there is :-)

my $data = {}; while (<DATA>) { chomp; my @fields = split /\s*[=\.]\s*/; build( $data, \@fields, pop @fields ); } sub build { my ($ref, $path, $val) = @_; return $val unless @$path; my $el = shift @$path; if ($el=~/^\[(\d+)\]$/) { $ref->[$1] = build( $ref->[$1], $path, $val ) } else { $ref->{$el} = build( $ref->{$el}, $path, $val ) } return $ref; } __DATA__ object.prop.subprop.[0].name = foo object.prop.subprop.[1].name = bar obj.prop.[0] = blah obj.prop.[1] = 1000

$data then looks like so:

{ obj => { prop => ["blah", 1000] }, object => { prop => { subprop => [{ name => "foo" }, { name => "bar" + }] } }, }

And then to walk the data structure:

sub dive { my ($ref,@path) = @_; return $ref unless @path; my $el = shift @path; if ($el=~/^\[(\d+)\]$/) { return dive( $ref->[$1], @path ) } else { return dive( $ref->{$el}, @path ) } } print dive( $data, qw/ obj prop [0] / ), "\n"; # prints "blah" print dive( $data, qw/ object prop subprop [1] name / ), "\n"; # prints "bar"

Hope this helps,
-- Hauke D

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (4)
As of 2024-04-25 12:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found