{ package Array::Grouped; sub TIEARRAY { bless { n => $_[1], array => $_[2] } => $_[0] } sub FETCHSIZE { @{$_[0]{array}} / $_[0]{n} } sub FETCH { my $self = shift; my ($i) = @_; my $n = $self->{n}; return sub { \@_ }->(@{$self->{array}}[$i*$n .. $i*$n + $n - 1]); } } my @bar = 0 .. 9; tie my @foo, Array::Grouped::, 2, \@bar; for (@foo) { $_->[0] = 'x'; } print @bar; # x1x3x5x7x9 ### Update: sub by_groups_of { tie my @foo, Array::Grouped::, @_ } my $foo = by_groups_of(2, \@bar); for (@$foo) { $_->[0] = 'y'; } print @bar; # y1y3y5y7y9