Your subroutine undef's $sub, but it does not undef $payment. In fact, without magic, $payment cannot be automatically undefined. Even if you had a reference to your code, it would be a copy of the reference, and manipulating the copy would not affect other copies.
Assuming that there was no other way to accomplish what you want (i.e. you really need to be able to have a subroutine undef itself), try introducing another level of reference, such that $payment is a reference to a reference that you control. For example: (modified from your original code)
sub purse { my $balance = shift; my $coderef; $coderef = sub { my($who, $qty) = @_; print "Paying $who $qty\n" if ($balance - $qty) >= 0; undef $coderef if $balance <= 0 }; # Return a reference to your code reference. \ $coderef; } { my $$payment = purse(10); for ([qw/mom 7/], [qw/dad 3/], [qw/myself 1/]) { $$payment->(@$_) if $$payment; } }
In reply to Re: Giving subroutines access to themselves
by MarkM
in thread Giving subroutines access to themselves
by diotalevi
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |