in reply to Re: Matching data against non-consecutive range
in thread Matching data against non-consecutive range

Slick! I wouldn't have thought of using reduce for this. I'll ++ you tomorrow when I get more votes ;)

There is a small bug in the implementation, though: single number ranges fail. Add 618 or 619 to the test data, you get "618 isn't there!".

Here's a patch to fix it:

# $last ||= 1; # needs to be $last ||= $first;
And here's another patch that disposes of pre-allocating the 1000 character string for $zones. I'm sure it's slower, but it'll work for an arbitrary range (ie, > 1000):
my $zones = reduce { my( $first, $last ) = split '-', $b; $last ||= $first; #allocate $a here $a .= chr(0) x ( $last ); substr( $a, $first, $last - $first + 1 ) = 'x' x ( $last - $first ++ 1 ); $a } '', split ',', '10-374,376-379,382-385,388-499,530-534,541-543,618,619,700-704,707-70 +9';

Update: added second patch

Replies are listed 'Best First'.
Re^3: Matching data against non-consecutive range
by BrowserUk (Patriarch) on Jan 27, 2005 at 22:32 UTC

    Patch applied. Many thanks++


    Examine what is said, not who speaks.
    Silence betokens consent.
    Love the truth but pardon error.
      That was fast! Too fast. Or maybe I'm too slow ;)

      I was still finishing composing my node - maybe I should have just posted a second node. I added a second bit to get around preallocating the string for $zones, if you're interested.