[tpm] Breaking a string up into hash keys

Uri Guttman uri at stemsystems.com
Sun Apr 14 08:43:46 PDT 2013

On 04/14/2013 08:53 AM, Olaf Alders wrote:

> use Hash::Flatten qw( flatten );

you don't need that module if you just use a very obscure but valid perl 
trick call multidimensional hashes. this is from old perl4 days but 
still works. if you use a list as the key in a scalar hash lookup, the 
list is joined with $; (see perlvar) and used as a single key. $; 
defaults to "\034" which is not printable. note that that value is 
unlikely to be in any printable key so the joined string will be unique 
and work as a flat hash key.

so all you need to do is use that trick to generate the single level 
hash and also to access it.
> my $key = 'this::and::the::other::thing';
> $key =~ s/::/./g;

instead of s/// just do a split on ::

	my @keys = split /::/, $keys ;

	$flat{ @keys } = 'foo' ;

if that doesn't work because the array is put into scalar context, you 
can do the join directly:

	$flat{ join $;, @keys } = 'foo' ;

and stay away from string eval for any normal data manipulation. it is 
slow and dangerous and actually rarely needed. it is NOT needed here at all.


More information about the toronto-pm mailing list