Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

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.

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. <->
      my @arraynew = grep { foo($item) } @array; if ($#arraynew != $#array) { # do something when item removed }
      my @arraydelete = grep { !foo($item) } @array; @array = grep { foo($item) } @array; foreach my $item (@arraydelete ) { # do something when item removed }
      Hope it helps
      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?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://217353]
[Corion]: 1nickt: Finding autobox in production would give me pause, yes
[LanX]: efficient survey
[MidLifeXis]: And under MINGW64_NT-6.1 MYHOST 2.6.0(0.304/5/3) 2016-09-09 09:46 x86_64 Msys there seem to be issues with escapes in external build tool calls.
[Corion]: I mean, it's a technical feat it achieves, but... why? ;)
[MidLifeXis]: And it also has the 0.14 version of the tarball in its manifest.
[LanX]: avoiding unreadable brackets
[MidLifeXis]: Although the previous one could be a b0rken PATH, I would need to dig for that.
[thezip]: I've got to go to meetings now. If anyone has further comments regarding Spreadsheet::XLSX deployment to Strawberry Perl 5.24.1, please /msg me -- thanks!
LanX has to go ... plans to crash with a car into a group of pythonistas while screaming "LARRY IS THE GREATEST"
LanX ... darn ... where is my car?

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (11)
As of 2017-03-23 17:28 GMT
Find Nodes?
    Voting Booth?
    Should Pluto Get Its Planethood Back?

    Results (291 votes). Check out past polls.