{ package foo; # not tied so all is well my %h = qw(one two three four); sub new { bless { val => \%h } } sub val : lvalue { $_[0]->{val}->{one} } } use Devel::Peek; my $obj = foo->new; $obj->val = "foo"; Dump( $obj->{val}->{one} ); __output__ SV = PV(0x80f9c40) at 0x80f9964 REFCNT = 1 FLAGS = (POK,pPOK) PV = 0x80f9018 "foo"\0 CUR = 3 LEN = 4 #### { package foo; use Tie::IxHash; tie(my %h, 'Tie::IxHash', qw(one two three four)); sub new { bless { val => \%h } } sub val : lvalue { $_[0]->{val}->{one} } } use Devel::Peek; my $obj = foo->new; Dump( $obj->{val}->{one} ); # dies here $obj->val = "foo"; __output__ SV = PVMG(0x8131170) at 0x8154b68 REFCNT = 1 FLAGS = (TEMP,GMG,SMG,RMG) IV = 0 NV = 0 PV = 0 ... many more lines of output Can't return a temporary from lvalue subroutine at - line 9