Acme::Globule::Range - Alternative range operator


Acme-Globule documentation Contained in the Acme-Globule distribution.

Index


Code Index:

NAME

Top

Acme::Globule::Range - Alternative range operator

VERSION

Top

version 0.004

SYNOPSIS

Top

 use Acme::Globule qw( Range );

 foreach (<10..1>) {
   print "$_... ";
 }
 print "Lift-off!\n";

 # put down that crack pipe...
 sub my_keys(\%) {
   my @hash = %{ $_[0] };
  return @hash[ glob("0,2..$#hash") ];
 }

 sub my_values(\%) {
   my @hash = %{ $_[0] };
  return @hash[ glob("1,3..$#hash") ];
 }

DESCRIPTION

Top

This is a Acme::Globule plugin that makes glob() do range operations. The following range formats are supported:

A..Z

Returns the integers between A and Z. If Z is lower than A, this will return a reversed range. Thus <1..9> is (1..9) and <9..1> is (reverse 1..9).

A,B..Z

Returns the integers between A and Z with a step such that the second value is B. Thus <1,3..9> is (1, 3, 5, 7, 9).

A..Y,Z

Returns the integers between A and Z with a step such that the next to last value is Y. Thus <1..7,9> is (1, 3, 5, 7, 9).

Any other string will fall through to the next plugin.

METHODS

globule

The implementation of the range operator. You should never need to call this directly.

BUGS

Top

The syntax is rather rigid.

SEE ALSO

Top

List::Maker which supports a wider range (*groan*) of syntax but affects glob() globally.

AUTHOR

Top

Peter Corlett <abuse@cabal.org.uk>

COPYRIGHT AND LICENSE

Top


Acme-Globule documentation Contained in the Acme-Globule distribution.

package Acme::Globule::Range;
BEGIN {
  $Acme::Globule::Range::DIST = 'Acme-Globule';
}
BEGIN {
  $Acme::Globule::Range::VERSION = '0.004';
}
# ABSTRACT: Alternative range operator
use Regexp::Common;
use warnings;
use strict;

my $num = $RE{num}{int};

sub _range {
    my($first, $last, $step) = @_;
    #warn "$first..$last (step $step)\n";
    my @range;
    if ($step > 0) {
        while ($first <= $last) {
            push @range, $first;
            $first += $step;
        }
    } elsif ($step < 0) {
        while ($first >= $last) {
            push @range, $first;
            $first += $step;
        }
    } else {
        return [ $first ];
    }
    return \@range;
}

sub globule {
    my($self, $pattern) = @_;
    local $_ = $pattern;
    if (/^($num)\.\.($num)$/) {
        if ($1 < $2) {
            return _range($1, $2, 1);
        } elsif ($1 > $2) {
            return _range($1, $2, -1);
        } else {
            return [ $1 ];
        }
    } elsif (/^($num),($num)\.\.($num)$/) {
        return _range($1, $3, $2-$1);
    } elsif (/^($num)\.\.($num),($num)$/) {
        return _range($1, $3, $3-$2);
    } else {
        return;
    }
}


1;

__END__