#!/usr/bin/perl -w use strict; use Data::Dumper; my $s = { foo =>'bar', baz => { troz => 'zort', blort => { poit => 'qux', } } }; print Dumper $s; # This works in 5.6.1 and later set($s, qw/baz blort poit/) = "Whee!"; set($s, qw/baz troz/) = "Joy!"; # In 5.6.0 (and earlier) you have to: # set($s, qw/baz blort/)->{poit} = "Whee!"; # set($s, qw/baz/)->{troz} = "Joy!"; print Dumper $s; sub set : lvalue { @_ == 1 ? $_[0] : set($_[0]{$_[1]},@_[2..$#_]); }