Microjoin handles left, right, inner, and outer joins. It operates on hashes; no error handling is included. For context, I wrote it in part to see how quickly I could get something potentially useful off the ground.