There sort of is a way to "implement range operator in perl source". Perl has a feature called tying that lets you implement indexing on an array yourself and lets you return something like the index of the element as the value. I have included a bare bones implementation of an array whose values are a sequence below. The solution has virtually no memory limitation on the size of the sequence.
package Tie::SeqArray;
use strict;
use warnings;
use parent 'Tie::Array';
sub TIEARRAY {
my $self = shift;
my $class = ref($self) || $self;
my $sequence_size = shift || die "sequence size of at least one re
+quired";
return bless {seq_size => $sequence_size};
}
sub FETCH {
my $self = shift;
my $i = shift;
return $i >= 0 && $i < $self->{seq_size} ? $i +1 : undef;
}
sub FETCHSIZE {
my $self = shift;
return $self->{seq_size};
}
package main;
use strict;
use warnings;
# from Perl Cookbook http://docstore.mik.ua/orelly/perl/cookbook/ch02_
+18.htm
sub commify {
my $text = reverse $_[0];
$text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1_/g;
return scalar reverse $text;
}
my (@aa, @bb);
tie @aa, 'Tie::SeqArray', 20_000_000;
tie @bb, 'Tie::SeqArray', 20_000_000;
print $aa[100], ' ', commify(scalar(@aa)), "\n";
print commify($bb[19_999_001]), ' ', commify(scalar(@bb)), "\n";
__END__
101 20_000_000
19_999_002 20_000_000