in reply to Giving subroutines access to themselves

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; } }

Replies are listed 'Best First'.
Re^2: Giving subroutines access to themselves
by diotalevi (Canon) on Dec 17, 2002 at 19:47 UTC

    Details, details. *grin*