use Tie::NumRange; my ($r,$g,$b); tie $r, Tie::NumRange => (0, 0, 255); tie $g, Tie::NumRange => (0, 0, 255); tie $b, Tie::NumRange => (0, 0, 255); $r = 100; # fine $g = 200; # fine $b = 300; # set to 255 $b -= 150; # fine, is now 105 $g -= 150; # fine, is now 50 $r -= 150; # set to 0