Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

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

by haukex (Chancellor)
on Sep 07, 2016 at 12:43 UTC ( #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
Node Status?
node history
Node Type: note [id://1171313]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (7)
As of 2020-03-28 18:50 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    To "Disagree to disagree" means to:









    Results (167 votes). Check out past polls.

    Notices?