{ my array; sub set{ my( $frag, $start, @meta ) = @_; @array[ $start .. ( $start + length( $freg ) -1 ) ] = ( Fragment->new( $frag, @meta ) ) x length( $frag ); return $array[ $start ]; } sub find{ my( $offset ) = @_; return $array[ $offset ]; } } ... set( 'FOO', 0, ... ); set( 'QUUX', 3, ... ); set( 'BAR', 7, ... ); ... my $found = find( 5 ); print $found->value; # prints 'QUUX'; #### { my $pseudo; my @frags; sub set{ my( $frag, $offset, @meta ) = @_; push @frags, Fragment->new( $frag, @meta ); $pseudo .= pack( 'v', $#frags ) x length( $frag ); return $frags[ -1 ]; } sub find{ my $offset = @_; my $index = unpack( 'v', substr( $pseudo, $offset, 2 ) ); return $frags[ $index ]; } }