in reply to Re^7: Invoke sub whose name is value of scalar
in thread Invoke sub whose name is value of scalar

Did you actually try my suggestions? Or, did you just read them and go "I don't get it."?

Yes, I tried your suggestions. I'm really interested in knowing how you would solve the problem, but with your indications I didn't get it:

Remove the no strict 'refs'; in both subroutines and try the following: ...
my $root = {}; _create_node ($root,"pp1","first"); _create_node ($root->{pp1},"ppp1","second"); _create_node ($root->{ppp1},"pppp1","third"); _create_node ($root->{pppp1},"ppppp1","root"); my $infos = _go_through('p1'); #my $infos = _go_through($root); # doesn't work either print Dumper $infos; sub _create_node { # no strict 'refs'; my ($node,$parent,$node_info) = @_; @{$node}{qw/parent info/} = ($parent,$node_info); } sub _go_through { my ($node) = @_; return "" unless defined ${$node}{"info"}; my @info_nodes; while (${$node}{"info"} ne "root"){ push @info_nodes, (${$node}{"info"}); $node = ${$node}{"parent"}; ## Line 33 } return \@info_nodes; }

This doesn't work:

Can't use string ("pp1") as a HASH ref while "strict refs" in use at ... line 33

Obviously, I'm missing something, that is why I asked

citromatik

Replies are listed 'Best First'.
Re^9: Invoke sub whose name is value of scalar
by dragonchild (Archbishop) on Apr 14, 2008 at 16:47 UTC
    Oh. I see the problem and why I didn't see it before. Your problem is that you're mixing data structures. Try the following version of _create_node and _go_through:
    _create_node ('p1',"pp1","first"); _create_node ('pp1',"ppp1","second"); _create_node ('ppp1',"pppp1","third"); _create_node ('pppp1',"ppppp1","root"); my $infos = _go_through('p1'); print Dumper $infos; { my %nodes; sub _create_node { my ($node_id,$parent,$node_info) = @_; @{$nodes{$node_id}}{qw/parent info/} = ($parent,$node_info); } sub _go_through { my ($node_id) = @_; return "" unless defined ${$nodes{$node_id}}{"info"}; my @info_nodes; while (${$nodes{$node_id}}{"info"} ne "root"){ push @info_nodes, (${$nodes{$node_id}}{"info"}); $node_id = ${$nodes{$node_id}}{"parent"}; ## Line 33 } return \@info_nodes; } }
    I actually tested this code. :-)

    My criteria for good software:
    1. Does it work?
    2. Can someone else come in, make a change, and be reasonably certain no bugs were introduced?
Re^9: Invoke sub whose name is value of scalar
by Arunbear (Prior) on Apr 14, 2008 at 16:42 UTC
    You need to adjust your syntax, try:
    $node = $node->{"parent"}; ## Line 33

    Update: this is incorrect, please ignore.