Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: walking an array and unshifting

by tadman (Prior)
on Jun 09, 2002 at 05:56 UTC ( [id://172889]=note: print w/replies, xml ) Need Help??


in reply to walking an array and unshifting

From what I can tell, if you pull the carpet out from underneath Perl, you're going to pay the price. One way to get things on the same wavelength is to either use grep to do your list filtering:
@list = grep { $_ != 2 && $_ != 4 } @list;
Or, you can go all Old School and do it this way:
my @foo = 1..10; for (my $i = 0; $i < @foo; $i++) { print "$i ($foo[$i])\n"; if ($foo[$i] == 5 || $foo[$i] == 6) { splice(@foo, $i, 1); redo; } }
The redo is important because it prevents the for loop from incrementing $i and thereby skipping an entry. This way, you're keeping pretty "close to the metal" and nothing will slip by.

Update:
As merlyn has suggested, this so-called "Old School" code is not an example of how it should be done, and is in fact, an example to the contrary. Using map and grep is going to be more effective and less prone to programmer error virtually every time, so that's what I do. With the example, I was merely trying to show how difficult it was to do if you chose not to use grep.

Replies are listed 'Best First'.
•Re: Re: walking an array and unshifting
by merlyn (Sage) on Jun 09, 2002 at 15:52 UTC
    That's far too complicated a solution for me to leave standing after a code review if I was doing this formally.

    If you merely want to avoid processing items based on their value, use a next in a foreach:

    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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://172889]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (3)
As of 2024-04-18 02:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found