in reply to Re: Re: Splice of ref to AoH not removing element
in thread Splice of ref to AoH not removing element

map and grep are really pretty easy, once you know the secret: read them right to left.

map iterates over a list, executing the code block for each element in turn, returning a list of whatever the code block returns. Use it to transform one list into another.

grep iterates over a list, executing the code block for each element in turn, returning a list of only those elements for which the code block returns true. Use it to filter out list elements.

Replies are listed 'Best First'.
Re: Re: Re: Re: Splice of ref to AoH not removing element
by bradcathey (Prior) on May 30, 2004 at 23:14 UTC
    Thanks again chromatic. I do understand the basics you explained. I guess there is something idomatic that I'm missing. I was able to get it working fine by replacing the grep line with:
    my @difference; for my $i ( 0 .. $#AoH_all) { for my $key (keys(%keep_ids)) { if ($AoH_all[$i]{'id'} == $key ) { $difference[$i] = $AoH_all[$i]; } } }
    I'm sure that your grep line is doing just that. I just can't get it to work.
    my %difference = grep { exists $keep_ids{ $_->{id} } } @AoH_all; print Dumper (%difference);
    prints:
    $VAR1 = 'HASH(0x808bd2c)'; $VAR2 = undef;
    The deadline looms, so I must 'loop' back for another look at grepping and that last line of yours. Thanks for getting me this far!

    Update: With those edits to chromatic's grep line, it worked as intended beautifully. PM rocks.

    —Brad
    "A little yeast leavens the whole dough."

      At least one problem is that you're assigning a list into a hash — which is legal, but probably not what you want in this case:

      my %difference = grep { exists $keep_ids{ $_->{id} } } @AoH_all;

      I think you want something more like this (note that I'm assigning this into an array, not a hash):

      my @keepers = grep { exists $keep_ids{ $_->{id} } } @AoH_all;