Brian Ling wrote:

> my $test1 = ${refer}->{value}->{fred};
> print Dumper($refer);
> # this doesn't change the data as i'd expect
> 
> my $test2 = ${refer}->{value}->{fred}->{value};
> print Dumper($refer);
> # this actually creates a key 'fred' pointing
> # to a empty hash ref #I
> 
> So my question really has two parts.
> 
> Why does the above actually change the data, any
> pointers to reading material would be great. I've read
> a bit about autovification, is that what's going on.
> If so, how is this happening with an "assignment" or
> an "if".

> my $test1 = ${refer}->{value}->{fred};

    Perl does not autovivify $refer->{value}{fred}.

   Read perlfaq4:
  "Why does passing a subroutine an undefined
   element in a hash create it?"

  "Normally, merely accessing a key's value for
   a nonexistent key does not cause that key to
   be forever there."


> my $test2 = ${refer}->{value}->{fred}->{value};

    Here we are looking for a key's value. Perl
does not autovivify that key, but it does
autovivify $refer->{value}{fred} as expected.


> Given that I have a data structure similar to the
> above (returned from a module), of which I don't
> know the exact shape. How do I test for the
> existence of a key, down a branch without
> changing the data. All I could come up with is:
> 
> if (${refer}->{value}->{fred} ) {
>       my $test3 = ${refer}->{value}->{fred}->{value}
> }
>
> As I know if fred exists there will be a key called
> value, and testing for fred doesn't change my data.
> Is there a better way of doing this?
 

   Read 'perlfunc' for details about the 'exists'
function. I would still test $refer->{value}{fred}{value}. 


if (    exists $refer->{value}{fred}
    and exists $refer->{value}{fred}{value} ) {

    my $test3 = $refer->{value}{fred}{value};
}

    OR:

my $test3 = $refer->{value}{fred}{value}
    if      exists $refer->{value}{fred}
        and exists $refer->{value}{fred}{value};




HTH,

Charles K. Clarkson
-- 
Mobile Homes Specialist
254 968-8328


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to