in reply to Re: Re: Re: Starting foreach at an arbitrary position
in thread Starting foreach at an arbitrary position

BrowserUk writes:

Why while ( ($_) = $iter->() ) { ... rather than while ($_ = $iter->() ) { ...?

Since your iterator function always returns the current element value, the while loop would terminate prematurely if one of the element values contained a non-truth value (undef, 0, ""). Even if defined() was used, the loop would terminate prematurely on an undef value. Using ($_) causes the list value to be checked for 'truthfullness', meaning that the loop will only terminate when the iterator returns the empty list. This is the desired behaviour, is it not? (Your iterator list does return () when it is complete)

BrowserUk writes:

As for the range operator building a list in list assignment. Yes, of course it does, but it is just a convenient way to set up some test data and doesn't having any bearing on the use of the iterator?

The array remains referenced within the iterator subroutine. Therefore, the memory being used by the array remains referenced. 1000000 scalars, even as simple integers, take up quite a bit of space. I estimate that 1000000 integer scalars take up at least 10 Mbytes of store. Using the range operator for very large ranges, outside of the "for (1 .. 1000000) {" case is extremely expensive.

UPDATE: I missed the point of the array. For an explanation of the striken out text, see BrowserUk's response.

Replies are listed 'Best First'.
Re: Re: Re: Re: Re: Starting foreach at an arbitrary position
by BrowserUk (Patriarch) on Jan 17, 2003 at 23:53 UTC

    MarkM writes

    The array remains referenced within the iterator subroutine. Therefore, the memory being used by the array remains referenced.

    Proving what? It would be somewhat stupid to try and iterate an array that no longer existed.

    MarkM writes:

    1000000 scalars, even as simple integers, take up quite a bit of space. I estimate that 1000000 integer scalars take up at least 10 Mbytes of store.

    ... but it's just test data.

    MarkM writes:

    Using the range operator for very large ranges, outside of the "for (1 .. 1000000) {" case is extremely expensive.

    ...but it's just test data.

    Obviously, noone would use an array of a million sequential integers and an iterator to generate 5 sequential integers from 500001 to 500005--or indeed any sequential set of integers in a real application. The only purpose of the consruction of the array is as a placeholder for "an array of abitrary data" in the test program.

    Any real application would already have the data that it wished to iterate so it would not have to build it. Therefore, your point has no bearing whatsoever on the use of the iterator the code served to demonstrate. Is that so hard to see?


    Examine what is said, not who speaks.

    The 7th Rule of perl club is -- pearl clubs are easily damaged. Use a diamond club instead.