Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options

Re^2: keys and values order on a hash

by hardburn (Abbot)
on Jul 11, 2011 at 17:29 UTC ( #913733=note: print w/replies, xml ) Need Help??

in reply to Re: keys and values order on a hash
in thread keys and values order on a hash

each() has its own problems, and I generally recommend against it in persistent environments like mod_perl. I once ran across a situation where a mod_perl process didn't reset the internal variable used to keep track of the current location for each() (was a long time ago, so I don't remember the specifics). This resulted in the next request on that process to start the search where the previous one left off instead of the beginning.

"There is no shame in being self-taught, only in not trying to learn in the first place." -- Atrus, Myst: The Book of D'ni.

Replies are listed 'Best First'.
Re^3: keys and values order on a hash
by ikegami (Pope) on Jul 11, 2011 at 18:29 UTC

    You'll get that situation if you have something like

    while (...each(%h)...) { ... last if ...; ... }

    The solution is

    keys(%h); # Reset iterator. while (...each(%h)...) { ... last if ...; ... }

    Note that keys does not actually compute the list of keys in void context.

      Indeed, you can insert a keys call prior to using 'each' in every instance, presuming you're not already in the middle of an 'each' on that hash already, and thereby reset the iterator mid-stream:

      my %h = qw( one 1 two 2 three 3 four 4 ); while (my($k, $v) = each %h) { say "$k=$v"; frobnicate(\%h); } sub frobnicate { keys %{ $_[0] } }

      Admittedly, this example is a bit contrived, but it's generally unexpected that your loop becomes infinite just from simple calls that don't appear to modify the hash. The workaround is obvious, if restricting: don't pass the hashref to any functions (including functions with prototypes that auto-enreference it). It's even worse if the hash is global; you essentially can't call any functions, for fear that, somewhere in the call chain, something will call 'keys' on the hash.

      In my opinion, it's too many caveats to make 'each' very useful.

Re^3: keys and values order on a hash
by BrowserUk (Pope) on Jul 11, 2011 at 18:59 UTC

    I don't use mod_perl, but I would have assumed that the scenario you describe would only occur if the hash was a global?

    And isn't using globals in persistent environment one of the (many) no-nos? Or at least, something you are warned about that you must take extra care with.

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://913733]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (4)
As of 2018-04-21 04:31 GMT
Find Nodes?
    Voting Booth?