# Multiple level hash assignment equivalence to perl

**URL:** <https://www.ruby-forum.com/t/multiple-level-hash-assignment-equivalence-to-perl/98173>\
**Category:** Ruby\
**Created:** [July 12, 2006, 10:41pm UTC](https://www.ruby-forum.com/t/multiple-level-hash-assignment-equivalence-to-perl/98173 "2006-07-12T22:41:48Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![dmcclean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/91b2a8/32.png) [@dmcclean](https://www.ruby-forum.com/u/dmcclean)\
**Post date:** [July 12, 2006, 10:41pm UTC](https://www.ruby-forum.com/t/multiple-level-hash-assignment-equivalence-to-perl/98173/1 "2006-07-12T22:41:48Z")

</div>

Is there a succinct way in ruby to do a multiple level hash assignement?  
I am more  
used to perl, which you can do something like

$hp-\>{level1}-\>{level2} = 3

even if the first and second level had never existed below.

Any help would be appreciated.

Regards,  
Don Mc

---

<div class="post-metadata">

**Author:** ![dmcclean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/91b2a8/32.png) [@dmcclean](https://www.ruby-forum.com/u/dmcclean)\
**Post date:** [July 12, 2006, 10:53pm UTC](https://www.ruby-forum.com/t/multiple-level-hash-assignment-equivalence-to-perl/98173/2 "2006-07-12T22:53:20Z")

</div>

don mc wrote:

> Is there a succinct way in ruby to do a multiple level hash assignement?  
> I am more  
> used to perl, which you can do something like
> 
> $hp-\>{level1}-\>{level2} = 3
> 
> even if the first and second level had never existed below.

There’s an autovivification trick, using the default proc of a hash (see  
ri default\_proc):

irb(main):002:0\> pr = proc {|h,k| h[k]=Hash.new(&pr) }  
=\> #Proc:0x02c15618@:2(irb)  
irb(main):003:0\> h = Hash.new(&pr)  
=\> {}  
irb(main):004:0\> h[1][2][3][4] = 5  
=\> 5  
irb(main):005:0\> h  
=\> {1=\>{2=\>{3=\>{4=\>5}}}}

---

<div class="post-metadata">

**Author:** ![dmcclean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/91b2a8/32.png) [@dmcclean](https://www.ruby-forum.com/u/dmcclean)\
**Post date:** [July 12, 2006, 11:29pm UTC](https://www.ruby-forum.com/t/multiple-level-hash-assignment-equivalence-to-perl/98173/3 "2006-07-12T23:29:47Z")

</div>

On Thu, 13 Jul 2006, Joel VanderWerf wrote:

> There’s an autovivification trick, using the default proc of a hash (see ri  
> default\_proc):
> 
> irb(main):002:0\> pr = proc {|h,k| h[k]=Hash.new(&pr) }  
> =\> #Proc:0x02c15618@:2(irb)  
> irb(main):003:0\> h = Hash.new(&pr)  
> ^^  
> ^^

nice! my approach is slightly more verbose.

-a

---

<div class="post-metadata">

**Author:** ![dmcclean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/91b2a8/32.png) [@dmcclean](https://www.ruby-forum.com/u/dmcclean)\
**Post date:** [July 12, 2006, 10:59pm UTC](https://www.ruby-forum.com/t/multiple-level-hash-assignment-equivalence-to-perl/98173/4 "2006-07-12T22:59:05Z")

</div>

Thanks! Thats just what I needed.

Regards,  
Don

Joel VanderWerf wrote:

> don mc wrote:
> 
> > Is there a succinct way in ruby to do a multiple level hash assignement?  
> > I am more  
> > used to perl, which you can do something like
> > 
> > $hp-\>{level1}-\>{level2} = 3
> > 
> > even if the first and second level had never existed below.
> 
> There’s an autovivification trick, using the default proc of a hash (see  
> ri default\_proc):
> 
> irb(main):002:0\> pr = proc {|h,k| h[k]=Hash.new(&pr) }  
> =\> #Proc:0x02c15618@:2(irb)  
> irb(main):003:0\> h = Hash.new(&pr)  
> =\> {}  
> irb(main):004:0\> h[1][2][3][4] = 5  
> =\> 5  
> irb(main):005:0\> h  
> =\> {1=\>{2=\>{3=\>{4=\>5}}}}
