Your "closure" sub isn't actually a closure; to be a closure it would not only have to access outside lexicals (like yours does), but also be
anonymous. What you have works anyway because you don't attempt to have several independent swap subs each of which has its own private state.
BTW, the reason why this doesn't work:
$result = $head. " er glad " . $result while( my $head = &swap );
... is that the parsing works left-to-right, and so $head has to be declared by the point where it is first seen in scanning, not where it would first be touched in execution.
-- Chip Salzenberg, Free-Floating Agent of Chaos