my @data = ... xadd( \@data, "3.4", 1); sub xadd { my $data = shift; my $elem = shift; my $incr = shift || 1; for ( 0..$#{$data} ) { $data->[1]->[$_] += $incr, $i = 1, last if $data->[0]->[$_] eq $elem; } unless ( $i ) { push @{$data->[0]}, $elem; push @{$data->[1]}, $incr; $data->[2] = [ sort { $a <=> $b } @{$data->[1]}; } # comment this line out if you don't # need to re-sort the 3rd array $data->[2] = [ sort { $a <=> $b } @{$data->[1]}; }