http://www.perlmonks.org?node_id=518225


in reply to Spot the bug

-- Randal L. Schwartz, Perl hacker
Be sure to read my standard disclaimer if this is a reply.

Replies are listed 'Best First'.
Re^2: Spot the bug
by tlm (Prior) on Dec 21, 2005 at 04:26 UTC

    By "bug", I presume you mean "bug in your code". The "exiting from the middle of an each-loop" has been discussed here before, and the behavior of Perl is as documented.

    Sorry I gave the impression (probably through my choice of title) that I thought this was a bug in Perl. I did mean a bug in the snippet I presented. Perl's behavior is, as you say, amply documented.

    the lowliest monk

Re^2: Spot the bug
by Perl Mouse (Chaplain) on Dec 21, 2005 at 10:46 UTC
    And for small hashes, that is fine. It's less so for a general purpose function in a module - it might get passed in a large hash, possibly even one that's tied to storage on disk.
    Perl --((8:>*

      The problem is people have a bad habit of forgetting to reset the iterator, and heaven help you if the general routine calls back out to uncontrolled code from inside the loop. Can you say "infinite loop"? :-)

      ---
      $world=~s/war/peace/g

        The problem is people have a bad habit of forgetting to reset the iterator,
        Yes, and? As long as you don't forget it in your general routine (unless you have good reason not to).
        heaven help you if the general routine calls back out to uncontrolled code from inside the loop.
        Yes, and? Presumably the uncontrolled code was passing in as an argument, one way or the other (otherwise, it wouldn't be uncontrolled). It's the users responsibility, just as it's the users responsibility to not pass in vital files as arguments to unlink.

        Iterators hand the programmer some rope, but what doesn't? That's not a reason to avoid iterators all together.

        Perl --((8:>*
      Well, I'd argue that any program for which the difference between a keys-based walk and an each-based walk is significant shouldn't be using hashes that large, not with the arrival of things like DBD::SQLite or other cheap databases.

      Yes, it mattered when Perl was running on 10Mhz 1Megabyte machines, and databases were tough, so a DBM hash was a cool thing. Those are long gone. {grin}

      -- Randal L. Schwartz, Perl hacker
      Be sure to read my standard disclaimer if this is a reply.

        Oh sure. But you don't always live in an ideal world. Sometimes, the data format is given, and Perl (and the programmer) just has to adapt. That's what Perl is supposed to be good at.
        Perl --((8:>*