in reply to Initializing Hashes of Hashes (of Hashes)

Fist off, that doesn't compile.
Secondly, how did you solve it?
Thirdly, what if you have A.B.C=3&A.B=3, what happens then?
Your strategy is flawed, I can't fathom why you'd wanna do something like this.

Also, how could a user possibly cause "not a HASH ref" error? He's not writing any code.

#!/usr/bin/perl use strict; use CGI; my $cgi = CGI->new( 'a.b.c=3&a.b.c=4&x.y=4' ); # convert somehow to: my $args = { 'a' => { b => { c => [3,4] }, }, 'x' => { 'y' => 4, }, }; use Data::Dumper; warn Dumper $args; die Dumper Shaz( $cgi ); #sub Shaz { "goes here -- you show me yours, i'll show you mine" } sub Shaz { my( $cgi ) = @_; my $shazbah = {}; for my $i ( $cgi->param() ) { my @bits = split /\./, $i; my $shazbot = $shazbah; for my $bit( 0..$#bits ) { if( $bit == $#bits ) { if( exists $shazbot->{$bits[$bit]} ) { if( ref $shazbot->{$bits[$bit]} ne 'ARRAY'){ $shazbot = $shazbot->{$bits[$bit]} = []; } else { $shazbot = $shazbot->{$bits[$bit]}; } } else { $shazbot = $shazbot->{$bits[$bit]} = []; } last; } if( exists $shazbot->{$bits[$bit]} ) { $shazbot = $shazbot->{$bits[$bit]}; } else { $shazbot = $shazbot->{$bits[$bit]} = {}; } } push @$shazbot, $cgi->param($i); } return $shazbah; } __END__ # I'd say this is pretty close $VAR1 = { 'x' => { 'y' => 4 }, 'a' => { 'b' => { 'c' => [ 3, 4 ] } } }; $VAR1 = { 'x' => { 'y' => [ '4' ] }, 'a' => { 'b' => { 'c' => [ '3', '4' ] } } };
update: Updated Shaz with actual code ;)(please note I did this in a single pass)


MJD says you can't just make shit up and expect the computer to know what you mean, retardo!
I run a Win32 PPM repository for perl 5.6x+5.8x. I take requests.
** The Third rule of perl club is a statement of fact: pod is sexy.

Replies are listed 'Best First'.
Re: Re: Initializing Hashes of Hashes (of Hashes)
by bsb (Priest) on Apr 29, 2003 at 01:03 UTC
    Re: compiling - I guess I took line breaking literally.

    Re: my solution - Posted in reply to myself later

    Re: overwriting - It breaks, yes, but the input is validated at a lower level. It does leave me open to typo bugs

    Re: bad strategy - maybe, convince me...

    Re: how could a user possibly cause "not a HASH ref" error -
    The situation I had in mind was a query like 'a=1&a=2&a.b=3'

      The situation I had in mind was a query like 'a=1&a=2&a.b=3' where an implementation may build { a => [1,2] } then try to set $args->{a}{b}=3
      That's why functions like ref and exists exist ;D Test and make a decision (clobber or skip).

      I would try to convince you this is bad strategy, but first you must list the reasons you want such a datastructure.
      It might not be bad strategy, but from where i'm standing it doesn't look that way.
      What you really need to do is fully define what should happen (basically draft up a full spec), so things like "not a HASH ref" are not an issue.

      Actually, nevermind the reasons you want this, just complete the spec (a detailed description of design criteria), and you should be fine (given that you implement it correctly ;D).


      MJD says you can't just make shit up and expect the computer to know what you mean, retardo!
      I run a Win32 PPM repository for perl 5.6x+5.8x. I take requests.
      ** The Third rule of perl club is a statement of fact: pod is sexy.