Я не смог найти способ, когда столкнулся с той же проблемой.
В качестве обходного пути вы можете передать ссылку и заставить макрос изменить указанную переменную.Это работает как для массивов, так и для хэшей.
Пример определения:
[%
# usage: newOb={}; MakeSomeThing(newOb, something)
MACRO MakeSomeThing(rv, something) BLOCK;
rv.a = 'a';
rv.b = something;
rv.c = 'c';
END;
%]
Пример использования:
[%
newOb = {};
MakeSomeThing(newOb, 'foo');
dumper.dump({'newOb' => newOb});
%]