Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
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
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 about the Monastery: (6)
As of 2014-08-22 02:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (145 votes), past polls