[tpm] Breaking a string up into hash keys

Rob Janes janes.rob at gmail.com
Sun Apr 14 09:04:03 PDT 2013


happy to oblige ...


my %hash;
$hash{a}{b}{c}{d}{e} = 5;
my $value = \%hash;
$value = $value->{$_} foreach split /::/, "a::b::c::d::e";

so,
while (<>) {
chomp;
my $value = \%data;
$value = $value->{$_} foreach split /::/;
print "$_ is $value\n";
}

i think that should work.

On Sat, Apr 13, 2013 at 11:33 AM, Quantum Mechanic
<quantum.mechanic.1964 at gmail.com> wrote:
> Just hope the OP doesn't exceed the recursion limit ;)
>
> Now we just need someone to post a loop version, and we'll be done.
>
> Cheers,
> Shaun
>
> On Apr 13, 2013, at 4:11 PM, Richard Dice <rdice at pobox.com> wrote:
>
> My solution is to go recursive...
>
> richard-dice-s-computer-9:Desktop rdice$ cat ./hashkeys.pl
> #!/usr/bin/env perl
>
> use warnings;
> use strict;
>
> use Data::Dumper qw ( Dumper );
>
> my $conf;
>
> $conf->{foo}{bar} = "a";
> $conf->{baz} = "1";
> $conf->{this}{and}{the}{other}{thing} = "what?";
>
> my @joinkeys = qw (
> foo::bar
> baz
> this::and::the::other::thing
> );
>
> foreach my $joinkey ( @joinkeys ) {
>   my @bits = split /::/, $joinkey;
>   print hashval($conf, \@bits);
>   print "\n";
> }
>
> exit 0;
>
> sub hashval {
>   my ($hash, $keybits) = @_;
>   if ( ref($hash->{$keybits->[0]}) eq 'HASH' ) {
>     return hashval($hash->{$keybits->[0]}, [ @$keybits[1..$#$keybits]]);
>   } elsif ( ! ref($hash->{$keybits->[0]}) ) {
>     return $hash->{$keybits->[0]};
>   } else {
>     die "Foo! They key string you gave me doesn't correspond to a known
> proper hash-of-hash entry within the 'conf' structure --> "  . Dumper($hash,
> $keybits);
>   }
> }
> richard-dice-s-computer-9:Desktop rdice$  ./hashkeys.pl
> a
> 1
> what?
>
>
>
> On Sat, Apr 13, 2013 at 1:29 AM, Digimer <lists at alteeve.ca> wrote:
>>
>> Hi all,
>>
>>   I've got a rather large, random-depth hash. ie:
>>
>> $conf->{foo}{bar} = "a";
>> $conf->{baz} = "1";
>> $conf->{this}{and}{the}{other}{thing} = "what?";
>>
>>   And so on. The number of hash keys can be quite varied, depending on the
>> use.
>>
>>   So now I want to be able to take a string that is in the format:
>>
>> foo::bar
>> baz
>> this::and::the::other::thing
>>
>>   Split on the :: and use that to pull the value out of the hash.
>>
>> Any help would be much appreciated! :)
>>
>> --
>> Digimer
>> Papers and Projects: https://alteeve.ca/w/
>> What if the cure for cancer is trapped in the mind of a person without
>> access to education?
>> _______________________________________________
>> toronto-pm mailing list
>> toronto-pm at pm.org
>> http://mail.pm.org/mailman/listinfo/toronto-pm
>
>
> _______________________________________________
> toronto-pm mailing list
> toronto-pm at pm.org
> http://mail.pm.org/mailman/listinfo/toronto-pm
>
>
> _______________________________________________
> toronto-pm mailing list
> toronto-pm at pm.org
> http://mail.pm.org/mailman/listinfo/toronto-pm
>


More information about the toronto-pm mailing list