in reply to lvalue trickery

Looking at the FETCH subroutine of Tie::IxHash solves the problem:
sub FETCH { my($s, $k) = (shift, shift); return exists( $s->[0]{$k} ) ? $s->[2][ $s->[0]{$k} ] : undef; }
You haven't stored anything in the hash yet, so $_[0]->{val}->{one} returns undef, which isn't an lvalue.

Suggested and untested solution: $h {one} = undef after the tie.

Abigail

Replies are listed 'Best First'.
Re: Re: lvalue trickery
by broquaint (Abbot) on Jul 26, 2002 at 14:46 UTC
    You haven't stored anything in the hash yet, so $_[0]->{val}->{one} returns undef, which isn't an lvalue.
    Erm ...
    { 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 Data::Dumper; my $obj = foo->new; print Dumper( $obj ); __output__ $VAR1 = bless( { 'val' => { 'one' => 'two', 'three' => 'four' } }, 'foo' );
    I figured that the issue might be in the FETCH method of Tie::IxHash, but I thought that tied variables were meant to behave just like normal variables (in terms of interface at least), apparently not.

    _________
    broquaint