http://www.perlmonks.org?node_id=1051512


in reply to Trouble with Transliterate Function

This appears to work correctly:

my @ranges = [ 0 ]; while ( <INTERVAL> ) { my ( undef, $start, $end ) = split; push @{ $ranges[ -1 ] }, $start - 1; push @ranges, [ $end ]; } push @{ $ranges[ -1 ] }, length $mask; for my $range ( @ranges ) { my ( $start, $end ) = @$range; next if $start == $end; substr( $mask, $start, $end - $start ) =~ tr//N/c; } print "$mask\n";