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. <-> | [reply] [d/l] |
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 | [reply] [d/l] [select] |
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
| [reply] [d/l] [select] |