Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: Re: Printing a hash in a specific order?

by Limbic~Region (Chancellor)
on Mar 15, 2003 at 16:01 UTC ( [id://243307]=note: print w/replies, xml ) Need Help??


in reply to Re: Printing a hash in a specific order?
in thread Printing a hash in a specific order?

Anonymous Monk,
It is magic - bad magic, but magic none the less. Without showing you my very poorly written OO code. Basically, I am creating a complex hash (HoHo...). There is really only one key to the hash at any one time - which points further down the complex structure. So $hashref is a scalar that is a reference that points to the actual hash. The %{$hashref} is dereferencing the reference it to make it look like a real hash. The keys extracts the one and only key that is there. Putting the parens around the my ($key) part changes the context from scalar (which would have returned the number of keys i.e. 1) to a list context (which returns the one and only key).

Cheers - L~R

  • Comment on Re: Re: Printing a hash in a specific order?

Replies are listed 'Best First'.
(dkubb) Re: (3) Printing a hash in a specific order?
by dkubb (Deacon) on Mar 15, 2003 at 16:46 UTC

    Here's a more efficient idiom for grabbing a single key from a hash reference:

    my $key = each %{$hashref};

    The approach you're using with my($key) = keys %{$hashref}; essentially generates a list of the keys in memory, assigns the first element in the list to $key, and then throws rest of the list out. If the size of the hash is large this could be wasteful, but even with small hashes there is a noticeable difference between the two idioms when benchmarking.

    Dan Kubb, Perl Programmer

    Updated: Made minor corrections noted by Limbic-Region

      dkubb,
      Two minor corrections:

    • my $key = each %{$hashref}; - need to dereference the hash
    • my($key) = keys %{$hashref}; doesn't generate a list of keys in memory and assign the first one to key. It assigns all of them in serialized format to the variable. The reason why this works is because there is only one key.

      I also disagree with your analysis that your method would be faster in my example. Each has to retrieve both the key and lookup the value (which we are throwing away). My method is only retrieving a one element list of keys. I do appreciate the effort at making this more efficient. As I said - my first OO project and I know I am making a lot of mistakes. I think the proper way to fix this would be to start over.

      Cheers - L~R

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://243307]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chanting in the Monastery: (4)
As of 2024-03-29 15:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found