|
Posted by nolo contendere on March 28, 2008, 10:13 am
Please log in for more thread options
> Peter J. Holzer wrote:
> >> nolo contendere wrote:
> >>> Provably untrue. See Ben's example. I'll restate the concept below.
>
> >>> my @ary =3D qw/a b c/;
> >>> # for (@ary, ()) {
> >>> # for ( (), @ary ) {
> >>> for ( @ary ) {
> >>> =A0 =A0 push @ary, 'd' if /c/;
> >>> =A0 =A0 print;
> >>> }
>
> >>> ...
>
> >>> only the uncommented 'for' line prints a 'd' at the end. so what you
> >>> say MAY be true if LIST is ONLY an array.
>
> >> Isn't that because the two commented one are two lists being combined
> >> into a new list, and it's *that* new list that's being iterated
> >> over, so even if you add to @ary, it doesn't change the "new list",
> >> which is just that, a new list created at the start of the loop
> >> before iterating begins - therefore the values of the new list are
> >> set and @ary has nothing to do with it after the create of the "new
> >> list."
>
> > Yes. But the same should be true for
>
> > for (@ary) {
> > =A0 =A0...
> > }
>
> > for() expects a list, the list is constructed from the elements of
> > @ary. If you modify @ary after the list is constructed, the list
> > shouldn't be affected, but it is. I think Ben Morrow is right here:
> > This smells like an optimization: If there is only a single array, it
> > can be used directly instead of creating a list from it.
>
> Actually the behaviors of "for (@ary)" and "for (@ary, ())" do seem
> consistant if you really think about it. The resulting list is what it
> iterates over (from the first element, to what ever *count* is... in the
> former case *count* come fro mthe array, and since the condition is
> checked at the start of each iteration, if the array is added to, the
> count is incremented.
>
> In the latter case, a new list is created from contents of @ary + an
> empty list, which gives you a new list, which contains the values of
> @ary, but is a new seperate list, and thus is not effected by changes to
> @ary because it has it's own copy of @ary's values.
>
Is this explanation based on analysis of the source implementation? or
are you just using inductive reasoning to extrapolate a general rule
from a few test cases?
|