>I've played
>tag the wall with the forehead long enough.

>   a)  a way to name a hash from user input

If you mean assign a value with in a hash using the user input, then:

      my %hash

      $key = <STDIN>;
      $val = <STDIN>;

      $hash{$key} = $val;

If you really want to let the user name your variables for you (which you
probably really don't want), you would use eval;

      $hashname = <STDIN>;
      eval ("\$$hashname;");

don't do that though...

>   b)  find a way to create a multi-level hash (hash within a hash)

This is done with references.  They only seem hard at first.
here's a hash:

      %happy_hash = (
            "smile"     => ":)",
            "bigger"    => ":D",
      );

here's another:

      %another_hash = (
            "far"       => "Look over There!",
            "near"      => "Look at this!",
      );

now here's a third that holds the first two:

      %big_hash = (
            "happy"     => \%happy_hash,
            "another"   => \%another_hash,
      );

the back slash means that the variable refers to the hash, but is not
really the hash.  This way you get a scalar (which is what hashes are made
of), but you can use it to get to the hash.

here's one syntax to get to the hash:

      $big_smile = ${$big_hash{"happy"}}{"bigger"};
      #     you can probably get away with $big_hash{"happy"}{"bigger"},
      #     and it doesn't look as confusing, but I use the previous
syntax.

$big_hash{"happy"} returns the reference to the happy_hash, just as this
would assign it to a scalar:
      $hrHappy = $big_hash{"happy"};

To dereference this to the hash is %{$big_hash{"happy"}}.  Just wrap the
scalar in braces and stick the appropriate symbol on front ($%@&*)
for $hrHappy it's %{$hrHappy}

Now you can access the value in the hash; just like a regular hash, but
with a weird lookin' name.  The syntax is $hashname{key}, so here it's
${$big_hash{"happy"}}{"bigger"} or ${$hrHappy}{"bigger"}, both of which
return $happy_hash{"bigger"}, which is ":D"

Ofcourse, why put hashes that have names in other hashes unless you have a
good reason?  So there are anonymous hashes.  They look like this:
      {"smile" => ":)", "bigger => ":D"}

and you can assign them just like a hash reference:

      %big_hash = (
            "happy"     => {
                  "smile"     => ":)",
                  "bigger"    => ":D",
            },
            "another"   => {
                  "far"       => "Look over There!",
                  "near"      => "Look at this!",
            },
      );

and create them on the fly too:
      ${$big_hash{"onion"}}{"burger"} = "beefy";
      ${$big_hash{"onion"}}{"ring"} = "greasy";

      $big_hash{"foul"} = {"bird" => "duck", "ball" => "strike"};

And hopefully code that looked illegible before is starting to make some
sense.

>#Create a multi-dimensional array
same thing:
      @big_arr = ([EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED]);

even:
      @hash_arr = (\%hash1, \%hash1, \%hash1);

or:
      @mixed_arr = (\%hash1, [EMAIL PROTECTED], \%big_hash, [EMAIL PROTECTED]);

There are lots of fun ways to build data structures using references.  You
can create anonymous subroutines too, and put those in a hash.

HTH
-Peter





-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to