Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot

Array to hash refs

by Anonymous Monk
on Aug 13, 2002 at 15:50 UTC ( #189833=perlquestion: print w/replies, xml ) Need Help??

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi monks, I have a problem that I thought I could solve by myself, but after thinking about it for far too long, I have realised that I am not experienced (or perhaps clever) enough. I want to turn an array of unknown length, for example @arr = ("a", "b", "c"), into hash refs: $hash->{a}->{b}->{c} = 1. If anyone knows how to do this I would be most grateful.

Replies are listed 'Best First'.
Re: Array to hash refs
by Abigail-II (Bishop) on Aug 13, 2002 at 16:01 UTC
    my @array = qw /a b c/; my $hash; my $val = 1; ($hash, $hash -> {pop @array}, $val) = (undef, $val, $hash) while @arr +ay > 1; $hash -> {pop @array} = $val;

      Even with jeffa's notes below, it still took me a while to wrap this around my brain but when I had, I came up with this....

      my @array = qw /a b c d e f/; my $hash; my $val = 1; ($hash->{pop @array}, $val, $hash) = ($val, $hash, undef) while @array +; $hash = $val;

      Which is slightly cleaner?, but that final assignment stood out so...

      my @array = qw /a b c d e f/; my $hash = 1; my $tmp; ($tmp->{pop @array}, $hash, $tmp) = ($hash, $tmp, undef) while @array +;

      Slightly non-intuative to assign the value to the hashref at the start but...

        return {map {$_ => 1} qw /a b c/}
        Or did I understand your questing wrong?


(jeffa) Re: Array to hash refs
by jeffa (Bishop) on Aug 13, 2002 at 16:06 UTC
    Here is all i could come up with:
    use strict; my @a = ('a'..'f'); my $hash; my $last = 1; for (reverse @a) { $hash->{$_} = $last; $last = {$_ => $hash->{$_}}; } delete $hash->{$a[$_]} for (1..@a);
    Hehehe, i waited until Abigail-II posted first though. Now i am going to spend some time figuring out how that works ... need more coffee!

    UPDATE: Ok, let's figure Abigail-II's code out ...

    When dealing with loops, a good way to understand the code is to chart out what happens at each iteration -
    • Iteration 1:
      • @array = ('a','b','c');
      • atomic:
        • $hash = undef;
        • $hash->{a} = $val; # $val = 1
        • $val = $hash;
      • # is ('b','c') > 1 ? yes
    • Iteration 2:
      • @array = ('b','c');
      • atomic:
        • $hash = undef;
        • $hash->{b} = $val; # $val = {a => 1}
        • $val = $hash;
      • # is ('c') > 1 ? no
    • Last line: (note that $hash is currently undef)
      • $hash->{c} = $val; # $val = {b => {a => 1}}
    The key to this code is the atomic triple assignment inside the while loop. Break that into 3 seperate assignments and the results are not the same. Abigail-II++ :)

    I think i like Anony's answer the best ... now that is using Perl to write Perl! /smack forehead


    (the triplet paradiddle with high-hat)
      You can break it into 4 separate assignments though....


Re: Array to hash refs
by nat0m (Novice) on Aug 14, 2002 at 08:49 UTC
    my solution:
    use strict; my @array = qw/a b c d e f/; my $t = my $hashref = {}; while (@array) { $t = $t->{ shift @array } = @array>1 ? {} : 1 };
      Eval man!
      my @array = qw/a b c d/;
      my $ref = {};
      $code = '$ref->{'.join('}->{', @array).'} = 1;';
      eval $code;
      use Data::Dumper;
      print Dumper($ref);
Re: Array to hash refs
by Anonymous Monk on Aug 14, 2002 at 07:14 UTC
    Thanks for all your help!
Re: Array to hash refs
by jackdied (Monk) on Aug 14, 2002 at 16:31 UTC
    It sounds like you might be trying to write Tree::Trie, which creates a nested, searchable list based on the characters in it.

    Check it out, and also the thread word association problem


Re: Array to hash refs
by deMize (Monk) on Oct 11, 2012 at 14:47 UTC
    I got here from Google and this is old but: $h={@arr};
    And if you prefer 1 to undef then:
    push @arr,1 if @arr % 2; $h={@arr};
    Nevermind: I misread the question, which was asking for a tree -- moderator, please delete this answer.


Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://189833]
Approved by thelenm
Front-paged by BrowserUk
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (3)
As of 2023-02-01 05:06 GMT
Find Nodes?
    Voting Booth?

    No recent polls found