XP is just a number PerlMonks

### Array to hash refs

 on Aug 13, 2002 at 15:50 UTC 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;
Abigail

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...

```my @array = qw /a b c/;
my %hash = map {\$_ => 1} @array;
return \%hash;

can that be done with a map and a hashref rather than having to return a hashref? ripped off from tadman in Re: an easier way with grep, map, and/or sort?.
--au

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

Abigail

(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++ :)

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

jeffa

```L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
B--B--B--B--B--B--B--B--
H---H---H---H---H---H---
```
You can break it into 4 separate assignments though....

Abigail

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
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

-jackdied

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};

Demize

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

How do I use this?Last hourOther CB clients
Other Users?
Others perusing the Monastery: (5)
As of 2024-04-25 07:14 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?

No recent polls found