<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;">On May 1, 2009 03:15:19 pm Uri Guttman wrote:<br>
&gt; &gt;&gt;&gt;&gt;&gt; "HB" == Henry Baragar &lt;Henry.Baragar@instantiated.ca&gt; writes:<br>
&gt;<br>
&gt;   HB&gt; #! /usr/bin/perl -w<br>
&gt;<br>
&gt; use warnings is better these days.<br>
&gt;   HB&gt; use strict;<br>
&gt;<br>
&gt;   HB&gt; sub oid_tree_add {<br>
&gt;   HB&gt;     my ($tree, $oid, $value) = @_;<br>
&gt;   HB&gt;     my @oid = split /\b/, $oid;<br>
&gt;<br>
&gt; why are you splitting on \b? you could just split on /\./ and get the<br>
&gt; oid numbers. then you can simplify (and speed up) the code below.<br>
&gt;<br>
You are correct (the code evolved and I did not finish refactoring).<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>See attached with this refactoring.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt;   HB&gt;     _oid_node_add($tree,$value,@oid);<br>
&gt;   HB&gt; }<br>
&gt;<br>
&gt;   HB&gt; sub _oid_node_add {<br>
&gt;   HB&gt;     my ($tree, $value, $key, @suboid) = @_;<br>
&gt;   HB&gt;     die "Expecting integer, got '$key'" unless $key =~/^\d+/;<br>
&gt;   HB&gt;     my $node = $tree-&gt;{$key};<br>
&gt;   HB&gt;     if (my $dot = shift @suboid) {<br>
&gt;   HB&gt;         die "Expecting '.', got '$dot'" unless $dot eq ".";<br>
&gt;   HB&gt;         $node-&gt;{subtree} = _oid_node_add($node-&gt;{subtree}, $value, @suboid);<br>
&gt;<br>
&gt; i won't get into detail here but if you split on . as i said above, you<br>
&gt; can just delete the check for dot. i can't see any reason to keep that<br>
&gt; logic.<br>
&gt;<br>
&gt;   HB&gt;     }<br>
&gt;   HB&gt;     else {<br>
&gt;   HB&gt;         $node-&gt;{value} = $value;<br>
&gt;   HB&gt;     }<br>
&gt;   HB&gt;     $tree-&gt;{$key} = $node;<br>
&gt;<br>
&gt; i don't see $node being modified anywhere. you modify its keys/values<br>
&gt; but $node is still the same hashref. so that line probably could go.<br>
It simply reads better (IMHO).<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt;   HB&gt;     $tree;<br>
&gt;<br>
&gt; use explicit return statements vs implicit last value returns. this is a<br>
&gt; bug waiting to happen if you ever add/modify code in that section. you<br>
&gt; may forget what was being returned and return some other expression.<br>
&gt;<br>
&gt;   HB&gt; }<br>
&gt;<br>
&gt;   HB&gt; sub oid_tree_sorted {<br>
&gt;   HB&gt;     my ($tree) = @_;<br>
&gt;   HB&gt;     my @sorted;<br>
&gt;   HB&gt;     for my $key (sort {$a &lt;=&gt; $b} keys %$tree) {<br>
&gt;   HB&gt;         my $node = $tree-&gt;{$key};<br>
&gt;   HB&gt;         push @sorted, $node-&gt;{value} if $node-&gt;{value};<br>
&gt;   HB&gt;         push @sorted, oid_tree_sorted($node-&gt;{subtree})<br>
&gt;   HB&gt;             if $node-&gt;{subtree};<br>
&gt;<br>
&gt; if a node has a value it won't have a subtree. <br>
No, a node is allowed to have both (this is not a pure tree).<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt; so you don't need the<br>
&gt; second test. in general you could have eliminated the need for the<br>
&gt; value/subtree keys and just used the value or hash ref. then you can<br>
&gt; tell if it is a value or tree node with ref(). it is a simpler and<br>
&gt; cleaner data tree design. again, i could be wrong in your details but<br>
&gt; this is a common design idea in perl.<br>
&gt;<br>
True, if you have a pure tree (which we don't)<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt; i leave the actual rewrite as an exercise as i am not up for it at the<br>
&gt; moment. :)<br>
&gt;<br>
&gt; thanx,<br>
&gt;<br>
&gt; uri<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>Regards,<br>
Henry<br>
<br />-- <br /><br>
Henry Baragar<br>
Instantiated Software<br>
416-907-8454 x42</p></body></html>