Range function
Xah Lee
xah at xahlee.org
Sun May 15 05:50:38 EDT 2005
Here's the Perl code.
----------
#! perl
# http://xahlee.org/tree/tree.html
# Xah Lee, 2005-05
#_____ Range _____ _____ _____ _____
=pod
B<Range>
Range($iMax) generates the list [1, 2, ... , $iMax].
Range($iMin, $iMax) generates the list [$iMin, ... , $iMax].
Range($iMin, $iMax, $iStep) uses increment $iStep, with the last
element in the result being less or equal to $iMax. $iStep cannot be 0.
If $iStep is negative, then the role of $iMin and $iMax are reversed.
If Range fails, 0 is returned.
Example:
Range(5); # returns [1,2,3,4,5]
Range(5,10); # returns [5,6,7,8,9,10]
Range( 5, 7, 0.3); # returns [5, 5.3, 5.6, 5.9, 6.2, 6.5, 6.8]
Range( 5, -4, -2); # returns [5,3,1,-1,-3]
=cut
sub Range ($;$$) {
if (scalar @_ == 1) {return _rangeFullArgsWithErrorCheck(1,$_[0],1);};
if (scalar @_ == 2) {return
_rangeFullArgsWithErrorCheck($_[0],$_[1],1);};
if (scalar @_ == 3) {return
_rangeFullArgsWithErrorCheck($_[0],$_[1],$_[2]);};
};
sub _rangeFullArgsWithErrorCheck ($$$) {
my ($a1, $b1, $dx) = @_;
if ($dx == 0) {print "Range: increment cannot be zero."; return 0}
elsif ($a1 == $b1) {return [$a1];}
elsif ( ((($b1 - $a1) > 0) && ($dx < 0)) || ((($b1 - $a1) < 0) && ($dx
> 0)) ) {print "Range: bad arguments. You have [$a1,$b1,$dx]"; return
0;}
elsif ((($a1 < $b1) && ($b1 < ($a1 + $dx))) || (($a1 > $b1) && ($b1 >
($a1 + $dx)))) {return [$a1];}
else { return _rangeWithGoodArgs ($a1,$b1,$dx);};
};
sub _rangeWithGoodArgs ($$$) {
my ($a1, $b1, $dx) = @_;
my @result;
if ($a1 < $b1) {for (my $i = $a1; $i <= $b1; $i += $dx) { push
(@result, $i);}; }
else {for (my $i = $a1; $i >= $b1; $i += $dx) { push (@result, $i);};
};
return \@result;
};
#end Range
##########
# test
use Data::Dumper;
print Dumper(Range(5,7,0.3));
More information about the Python-list
mailing list