in reply to Problems With Hash Pointer Assignments

Several points.

  1. Perl references are not c pointers.

  2. What is RecursiveFunctionToDeleteValueWithinHash() (whew!) supposed to return? If it is a recursive functions to delete a value within the hash, why does it need to return a *value* at all? That is, shouldn't it just return success or failure?

  3. What do you want this code to do?
    %{$HashData} = undef; %{$HashData} = %{$value};
    You are deleting the data refered to by $HashData (and in an unidiomatic way: better to say %$HashData = () if you really want that -- but you don't), and are then populating it with a copy of whatever was (refered to) in $value. Why? If $value has the correct data, why doesn't DeleteValueTreeWithinHash() simply return it? Oh, you want an IN/OUT function? Fine, then why doesn't RecursiveFunctionToDeleteValueWithinHash() really do what it name claims and modify the data referenced by its argument?

  4. Is there a reason why you are using $_[0] and $_[1]? They *can* be used for a tricky way to get in/out function parameters, but that's not always a good idea, and when you're dealing with references anyway, there's hardly any need, anyway. Modify the referenced data; your called will see the changes.

Do yourself a favor and read perlref (or perlreftut) carefully.

Replies are listed 'Best First'.
Re^2: Problems With Hash Pointer Assignments
by EchoAngel (Pilgrim) on Nov 30, 2004 at 20:45 UTC
    1. I guess that was school. 2. I would have liked it to just delete the value. But I was having problems and just tried returning the hash ref of each branch. 3. I just wanted to assign the hash structure of value into hashdata so I can use the %HashData normally in the main program. I guess I can change the name. 4. Do you mean i should use shift?
        But I was having problems and just tried returning the hash ref of each branch.
      That's not going to prove very useful, because then in the caller you'd need to assemble the branches again. delete can handle indirection: You can do something like

      delete $node->{$doomed_key}; # recurse through remaining elements

        I just wanted to assign the hash structure of value into hashdata so I can use the %HashData normally in the main program.

      That's fair enough: but you don't need to muck around with copies to achieve that. If in the caller code you have %Hash, and call your function with an argument \%Hash, any changes made indirectly to that data will show up in the caller. This is one of the main features of references.

        Do you mean i should use shift?

      It's a matter of style, so there will be differing opinions, but generally you can use my ($arg1, $arg2, ...) = @_ to get your parameters. (Sometimes shift is more appropriate, and sometimes even $_[0] etc. are the Right Thing -- but not typically.)

        Ahhhh, I almost forgot about the @_ way ! I was making copies of the Hashes before for creating a function to replace key values within the hash dimensions.