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 |