The reason that your script works is that it isn't really
changing the array. You're appending an empty set to it.
If there were one or more values after the array name in
the unshift call, the script would print "1", then consume
all available
memory before doing anything else.
update: I should have said "you're not
prepending anything to the array.
Also, the script might print more things before running out of
memory, if you happen to prepend more than one element
at a time, and the second element of that set was not
"2" or "4". But the script will still blow up.
| [reply] [Watch: Dir/Any] |
After reading your post, I am concerned ;-)
I thought that each "unshift" was removing the first entry in the array(ie $array|0|)...where does the "empty set" come in???
| [reply] [Watch: Dir/Any] |
perldoc -f unshift
unshift ARRAY,LIST
Does the opposite of a "shift". Or the opposite
of a "push", depending on how you look at it.
Prepends list to the front of the array, and
returns the new number of elements in the array.
unshift(ARGV, '-e') unless $ARGV[0] =~ /^-/;
Note the LIST is prepended whole, not one element
at a time, so the prepended elements stay in the
same order. Use "reverse" to do the reverse.
addendum: If you choose to use shift instead
of unshift, you will not run out of memory, and you will
see only one element ("1") printed out, which is maybe
what you were expecting in the first place.
| [reply] [Watch: Dir/Any] [d/l] |
| [reply] [Watch: Dir/Any] [d/l] [select] |
for $item (@list) {
next if $item == 2 or $item == 4;
... rest of processing ..
}
If you want a list that contains all but those items,
then use a grep, as you said:
my @newlist = grep { $_ != 2 and $_ != 4 } @list;
But your for-loop monstrosity is ripe for off-by-one errors, and even if you got everything just right, your maintenance programmer would almost certainly break it.
Extra special hint: walking a list with for-style loops is almost always WRONG. Yes, there are counterexamples, but start with that.
-- Randal L. Schwartz, Perl hacker | [reply] [Watch: Dir/Any] [d/l] [select] |