$c->forward() возвращает только истину. Истину в последней инстанции :)
А серьезно, он может вернуть лишь одно значение. И оно должно быть истинно. Если оно ложно - результатом будет ноль. И неважно, что вы хотели вернуть пустую строку или undef. Вернется ноль.
Массивы и хеши тоже нельзя возвращать. Т.к. получите последний элемент массива. Ссылки на них - пожалуйста. Ибо ссылка на массив истинна, даже если массив пустой.
Вот собственно и всё :) Теперь чуток примерчиков для наглядности:
sub t_zero { 0 }; sub t_empty { "" }; sub t_undef { undef }; sub t_arr { qw/a b c/ }; sub t_scalar { "ok" }; sub t_arref { [qw/a b c/] }; sub t_hashref{ {} }; sub test { my ( $self, $c ) = @_; $c->forward('t_zero'); # 0 $c->forward('t_empty'); # 0 $c->forward('t_undef'); # 0 $c->forward('t_arr'); # 'c' $c->forward('t_scalar'); # 'ok' $c->forward('t_arref'); # ['a', 'b', 'c'] $c->forward('t_hashref'); # {} };