in reply to Regex on array elements during push

push @array, map { (my $x = $_) =~ s/[?\s,]+//g; $x } grep { /\S/ } $ts->rows;

Nice and readable (at least to Juerd and me ... *grins*) And, yes, I actually have this construct in production code, sometimes 4 and 5 levels deep.

------
We are the carpenters and bricklayers of the Information Age.

Then there are Damian modules.... *sigh* ... that's not about being less-lazy -- that's about being on some really good drugs -- you know, there is no spoon. - flyingmoose

Replies are listed 'Best First'.
Re: Re: Regex on array elements during push
by Roy Johnson (Monsignor) on Mar 22, 2004 at 20:46 UTC
    Except $ts->rows is returning an array of array refs. The first element of each referenced array is the one to check for non-spaces, and the second one is apparently the one to modify and push:
    push @array, map { $_->[1] =~ s/[\s?,]//g and $_->[1] if $_->[0] =~ /\S/ } $ts->rows;

    The PerlMonk tr/// Advocate
      That was the ticket!! Works perfectly. My understanding of "map" is a bit weak, so I need to disect what you did.. AWESOME!! Thank you!
        map is a looping construct, which works a lot like grep, except that map returns all elements, while grep only returns those evaluating to true in the given expression/code block. map is typically used to derive new elements from the given list, while grep is typically used to filter the list according to some criterion. map is also similar to foreach.

        For instance, these are equivalent:

        my @x; foreach ( 0..9 ) { push @x, $_ }; my @x; @x = grep 1, 0..9; my @x; @x = map $_, 0..9;
        When map is used for good, it makes the code easier to read, and the dataflow easier to follow. But it can be abused, just like anything else useful.

        -QM
        --
        Quantum Mechanics: The dreams stuff is made of

        I'm glad it works for you, but I should point out a few flaws in the solution I proposed:
        1. The "and" will prevent the value from being returned, if no substitution occurs.
        2. My replacing of "grep" with an "if" within the map causes blank values to be pushed when the /\S/ doesn't match
        I should have just fixed the problem I saw, instead of trying to be clever.
        push @array, map { $_->[1] =~ s/[\s?,]//g; $_->[1]; } grep { $_->[0] =~ /\S/ } @rows;

        The PerlMonk tr/// Advocate