in reply to Re^2: Uses for an lvalue subroutine
in thread Uses for an lvalue subroutine

That's twisted and clever. One question: what is the intent of the ||= undef, other than changing $self->{$AUTOLOAD} to undef if it's 0 or ""?
my ($object) = new Object; $object->whatever(0); print "Whatever is '",$object->whatever(),"'\n"; # Oops!

Replies are listed 'Best First'.
Re^4: Uses for an lvalue subroutine
by tadman (Prior) on Jan 11, 2001 at 02:14 UTC
    chipmunk points out something that I had failed to test for. In my effort to reduce the code down to a minimum, that case slipped right through my logic. Here's Take II, new and improved support for 0 and "" added:
    
    sub AUTOLOAD : lvalue
    {
            my ($self) = shift;
    
            $AUTOLOAD =~ s/.*://;
    
            @_?
                    $self->{$AUTOLOAD} = shift 
                    : !defined($self->{$AUTOLOAD})?
                            $self->{$AUTOLOAD} = undef 
                            : $self->{$AUTOLOAD};
    }
    
    
    The reason for having $self->{$AUTOLOAD} = undef is to give the caller something to assign to. Returning an invalid hash entry will cause an assignment error. 'undef' is not a valid lvalue, but returning a reference to a variable which may have a value of 'undef' is acceptable.

    BTW, I've never had to indent my '?:'s before, but it was the only way to make how this worked clear(er).