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 required"; 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