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.
in reply to Toggling between two values
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