| Acme-Globule documentation | Contained in the Acme-Globule distribution. |
Acme::Globule::Range - Alternative range operator
version 0.004
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") ];
}
This is a Acme::Globule plugin that makes glob() do range operations. The following range formats are supported:
A..ZReturns 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..ZReturns 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,ZReturns 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
The implementation of the range operator. You should never need to call this directly.
The syntax is rather rigid.
List::Maker which supports a wider range (*groan*) of syntax but affects glob() globally.
Peter Corlett <abuse@cabal.org.uk>
This software is copyright (c) 2011 by Peter Corlett.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
| 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__