sub _insert { my ($node, $cmp, $key, $val) = @_; return [RED, $key, $val, undef, undef] if ! $node; # Do foo with $node my $result = $key cmp $node->[KEY]; if ($result == EQUAL) { $node->[VALUE] = $val; } elsif ($result == MORE) { $node->[RIGHT] = _insert($node->[RIGHT], $cmp, $key, $val); } else { $node->[LEFT] = _insert($node->[LEFT], $cmp, $key, $val); } # Do bar with $node # Do blah with $node return $node; }