> > PRADEEP GOEL said: > > > If i am not wrong somewhere , there is a bug come to my notice , > > > in PERL > > > > > > @lastnotpop = > > > ("where_gone_me","remaining_is_alright","no_fear_now"); foreach > > > $faltu (@lastnotpop) #$faltu is extra doesn't makes difference > > > even if removed { $pch = pop(@lastnotpop ); > > > print " \n can't pop last one from @lastnotpop > > > i.e.($lastnotpop[0] ) > > > : > > > popped element is $pch #"; > > > } > > > If there are more than one elemnt in a array(say @lastnotpop than > > > the last/first element i.e. $lastnotpop[0] can't be popped out in > > > this single foreach loop. > > > > > > I don't think it's intensional feature , else it should also not > > > be able to pop the only element , if it has one , but it does.
If would help a lot if you tried to find out what's going on: @a = (1,2,3); foreach my $loopvar (@a) { print "loop var: $loopvar\n"; print "poped: ".pop(@a)."\n"; print "\@a: (" . join(', ',@a) . ")\n\n"; } This prints: loop var: 1 poped: 3 @a: (1, 2) loop var: 2 poped: 2 @a: (1) Which is exactly what I would expect and the only sensible thing to do. It iterates on the array and you pop the last elements at the same time. Therefore in the first iteration it sets the $loopvar to the first element of the array and removes the last element (3rd element), in the second iteration it sets $loopvar to the second element and again removes the last element (2nd elemenr). And of course there'll be no more iterations because the array has only one element now and the loop wants the third element. The only thing you have to remember here is that the foreach(){} doesn't make a copy of the array it iterates over. Therefore if you change the array somehow the foreach(){} will operate on the modified array. See this: @a = (1,2,3,4,5); foreach my $loopvar (@a) { print "loop var: $loopvar\n"; print "shifted: ".shift(@a)."\n\n"; } Look what it prints! Now that seems confusing at first. but only if you do not remember that the foreach(){} only remembers its POSITION in the array, not the actual element. Therefore if you shift() off the first element, you move the other elements! The documentation says you should not do it. Not because it would be that hard to say what happens (once you understand what did I say above), but because it would be easy to create hard to find infinite loops: @a = (1,2,3,4); foreach my $loopvar (@a) { print "loop var: $loopvar\n"; if ($loopvar == 2) { unshift @a, 0; } } or @a = (1,2,3,4); foreach my $loopvar (@a) { print "loop var: $loopvar\n"; if ($loopvar == 4) { push @a, 4; } } (Well the loops would not be infinite, you'd run out of memory soon.) HTH, Jenda ===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz ===== When it comes to wine, women and song, wizards are allowed to get drunk and croon as much as they like. -- Terry Pratchett in Sourcery -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]