Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: Removing Items from an Array

by kabel (Chaplain)
on Dec 03, 2002 at 21:33 UTC ( #217353=note: print w/ replies, xml ) Need Help??


in reply to Removing Items from an Array

F:\>perl use strict; use warnings; my @numbers = 1 .. 10; @numbers = grep { $_ > 4 } @numbers; print "@numbers"; ^D 5 6 7 8 9 10 F:\>
grep iterates through @numbers, sets $_ to the current element and if the block returns true, the element will be in the output list. so just call foo inside the grep block with $_ and it should work.


Comment on Re: Removing Items from an Array
Download Code
Replies are listed 'Best First'.
Re: Re: Removing Items from an Array
by ibanix (Hermit) on Dec 03, 2002 at 21:41 UTC
    It would look like @array = grep { foo($item) } @array; would generate my correct new list; but what about printing out when it returns false, or a larger set of things I need to do upon a false return?

    <-> In general, we find that those who disparage a given operating system, language, or philosophy have never had to use it in practice. <->
      Try
      my @arraynew = grep { foo($item) } @array; if ($#arraynew != $#array) { # do something when item removed }
      or
      my @arraydelete = grep { !foo($item) } @array; @array = grep { foo($item) } @array; foreach my $item (@arraydelete ) { # do something when item removed }
      Hope it helps
      UnderMine
      but what about printing out when it returns false, or a larger set of things I need to do upon a false return?

      Well if it's just a matter of printing a message when foo() returns false, you could just add a print inside sub foo { ... } -- but if it's really "a larger set of things" that are needed on a false return, it might be too much to cram into sub foo { ... } (or maybe you don't have the privelege to muck with what "foo()" does).

      In which case, you could try defining a second sub, let's call it "foo_report()", have it do whatever is needed when foo() returns false, and make sure that foo_report() also returns false -- and include it in the grep condition:

      @array1 = qw/7 2 5 8 0 10/; @array2 = grep { foo($_) or foo_report($_) } @array1; print join " ","array2 contains:",@array2,$/; sub foo { ( $_[0] / 2 > 1 ) } sub foo_report { print "foo returned false for $_[0]\n"; # do lots of other stuff... 0; # make sure to return false, for grep's sake } __OUTPUT__ foo returned false for 2 foo returned false for 0 array2 contains: 7 5 8 10

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (4)
As of 2015-07-30 01:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (269 votes), past polls