sub overlap{ ($_[1] < $_[3] ? $_[1]: $_[3]) - ($_[0] > $_[2] ? $_[0] : $_[2]) + 1; } @data = qw[1 5 2 6]; print "\n@data : ", overlap @data and @data = map($_-1, @data) while grep $_>0,@data; 1 5 2 6 : 4 0 4 1 5 : 4 -1 3 0 4 : 4 -2 2 -1 3 : 4 -3 1 -2 2 : 4 -4 0 -3 1 : 4 my @data = qw[1 2 5 6]; print "\n@data : ", overlap @data and @data = map($_-1, @data) while grep $_>0,@data; 1 2 5 6 : -2 0 1 4 5 : -2 -1 0 3 4 : -2 -2 -1 2 3 : -2 -3 -2 1 2 : -2 -4 -3 0 1 : -2 my @data = qw[2 5 1 6]; print "\n@data : ", overlap @data and @data = map($_-1, @data) while grep $_>0,@data; 2 5 1 6 : 4 1 4 0 5 : 4 0 3 -1 4 : 4 -1 2 -2 3 : 4 -2 1 -3 2 : 4 -3 0 -4 1 : 4 my @data = qw[1 6 2 5]; print "\n@data : ", overlap @data and @data = map($_-1, @data) while grep $_>0,@data; 1 6 2 5 : 4 0 5 1 4 : 4 -1 4 0 3 : 4 -2 3 -1 2 : 4 -3 2 -2 1 : 4 -4 1 -3 0 : 4