Ну, так вот в Perl так не принято. К примеру, в JS решили ввести отдельный тип undefined для отличия подобных вещей. А в Perl он не нужен просто по архетиктуре.
Здесь инспектируется память процесса. В отличие от has_next из паттерна Iterator, здесь нет сайд-эффекта от этого (ну, если $hash будет не как в вашем примере, чем-то сложным, то там конечно произойдёт автовивификация, что вполне себе сайд-эффект).
Что такое undef значения? Это просто признак отсутствующего/ошибочного значения. Пытаться передавать им какой-то сигнал - как правило приводит к куче потерянного времени. Примерно также, как, например когда в качестве внешнего id решают использовать 0 (ноль)...
Это легко выразить, например, если передвать ссылку вместо данных (или, например, массив из 1 элемента). undef - конец данных, \ undef - признак отсутствия ответа.
Вот попытка использовать в качестве возвращаемых значений не что-то однозначно определяемое, а например в зависимости от какой-то внутренней структуры - разное по смыслу - это явный abuse динамической типизации. Рафинированный пример - "stringly typed" API