in reply to How to transform a matrix into a hash??

I would not recommend using eval. What's wrong with the recursive solution you have? If you really want to eval:

use Data::Dumper; my @start = ( [qw( a b c )], [qw( a b d )], [qw( b b b )], ); my %finish; my $e = join '', map { join '', '$finish', ( map {qq{{'$_'}}} @$_ ), " = 1;\n" } @start; print $e, "\n"; eval $e; print Dumper \%finish; __END__ $finish{'a'}{'b'}{'c'} = 1; $finish{'a'}{'b'}{'d'} = 1; $finish{'b'}{'b'}{'b'} = 1; $VAR1 = { 'a' => { 'b' => { 'c' => 1, 'd' => 1 } }, 'b' => { 'b' => { 'b' => 1 } } };

Update: In addition to saying that eval is probably not the best way to do this, I should have added that my particular implementation is not as careful as it should be. If this were really to be used, it would be a good idea to (1) better quote the indices into the hash, and (2) check the value of $@ (aka $EVAL_ERROR if you use English, see perlvar) in case of error.

Replies are listed 'Best First'.
Re^2: How to transform a matrix into a hash??
by ikegami (Patriarch) on Feb 05, 2008 at 18:00 UTC

    Yikes! If you're going to use eval do a better job of converting your strings to literals!

    Better yet, don't use eval at all.

    my %finish; for my $indexes (@start) { my $p = \\%finish; $p = \($$p->{$_}) for @$indexes; $$p = 1; }

    Data::Diver hides that mess away.