I consider the differences between 'use_eq' and 'use_return' to be inconsequential. The hash version can be explained by the hash lookups required. This version also lets you use an arbitrary number of 'last' items, though. I would also use exists over defined.