in reply to Re^3: Tree depth
in thread Tree depth

Sorry to bother you again, but your recent advice doesn't seem to help me. I've changed the code into this:

while (<>) { chomp; (@row) = split(/ /,$_); foreach $item (@row) { ($node,$value) = split(/->/,$item,2); $graph{$node} = $value; } sub depth { return max map { $_ and 1 + depth($graph{$_}) } @_; shift @_ } print depth(keys %graph); print "\n"; @row = (); $graph = "" }

, but I still get the values wrong, even if I just try it on a few lines of my infile. Here is an example of my infile (9 lines), picked at random but in a sequence: ------------------------------------

1->14 2->3 3->1 4->5 5->3 6->3 7->9 8->9 9->10 10->6 11->10 12->10 13- +>10 14->0 15->14 16->15 17->18 18->15 19->18 20->19 21->14 1->2 2->0 3->5 4->5 5->6 6->2 7->2 8->7 9->2 1->2 2->0 3->4 4->2 5->7 6->7 7->4 8->7 9->8 10->2 1->2 2->0 3->2 4->3 5->7 6->5 7->11 8->7 9->7 10->9 11->4 12->11 13->1 +2 14->15 15->11 16->2 1->2 2->0 3->2 1->2 2->0 3->2 4->5 5->3 6->5 7->6 8->6 9->8 10->9 11->12 12->10 13->2 1->2 2->0 3->5 4->5 5->2 6->2 7->6 8->2 1->3 2->3 3->4 4->0 5->4 6->5 7->6 8->6 9->8 10->11 11->8 12->11 13->1 +2 14->4 1->2 2->8 3->2 4->2 5->6 6->4 7->6 8->0 9->8 10->8
--------------------------------------

Here is the output that I get:

--------------------------------------
9 7 6 9 9 13 10 10 7
--------------------------------------

Then, if I try the script on a separate input file, containing just those 9 lines, I get the following output:

--------------------------------------
7 5 5 8 8 13 10 9 6
--------------------------------------

It's confusing... Do you have any ideas?

Replies are listed 'Best First'.
Re^5: Tree depth
by moritz (Cardinal) on Mar 13, 2012 at 15:15 UTC
    It's confusing... Do you have any ideas?

    Yes. Don't remove the use strict; use warnings; from the start of the script. It's there for a reason: it tells you what you are doing wrong. (Namely you're not clearing %graph, but rather $graph, which is a totally different variable, which you've never declared. use strict; catches that errors).

      This is how my code looks like when I'm using strict and warnings:
      #!/bin/perl; use strict; use warnings; use List::Util qw/max/; my %graph; while (<>) { chomp; (@row) = split(/ /,$_); foreach $item (@row) { ($node,$value) = split(/->/,$item,2); $graph{$node} = $value; } sub depth { return max map { $_ and 1 + depth($graph{$_}) } @_; shift @_ } print depth(keys %graph); print "\n"; @row = (); %graph = "" }

      Here are the error messages that I get:

      Global symbol "@row" requires explicit package name at count_PT.prl li +ne 11. Global symbol "$item" requires explicit package name at count_PT.prl l +ine 12.

      still confusing...