http://www.perlmonks.org?node_id=558218

GrandFather has asked for the wisdom of the Perl Monks concerning the following question:

I've been batting this problem around on and off for a week without making in useful progress. I have a script that parses trace output from a device and pulls out a series of 'from -> to' connection descriptions that I would like to present as a connection graph.

The current code prints the connection descriptions thus:

'TAvi' (-37) -> 'TDMk' (-32) 'TAvi' (-38) -> 'TMrk' (-34) 'TDMk' (-32) -> xfer (-12) 'TDif' (-7) -> xfer (-11) 'TDif' (-8) -> 'TMCF' (-35) 'TDig' (-27) -> 'TSpN' (-33) 'TLCI' (-36) -> 'TAvi' (-37) 'TMCF' (-35) -> 'TLCI' (-36) 'TMrk' (-34) -> xfer (-28) 'TSpN' (-33) -> 'TAvi' (-38) 'TSpN' (-33) -> 'TDMk' (-32) 'TSpN' (-33) -> 'TMCF' (-35)

By playing around by hand I can rearange that to show the inputs (TDif and TDig) to outputs (xfer) flow as:

'TDif' (-7) -> xfer (-11) 'TDif' (-8) -> 'TMCF' (-35) -> 'TLCI' (-36) -> 'TAvi' (-37) -> 'TDMk' +(-32) -> xfer (-12) ^-----------v-----------------------------------^ 'TDig' (-27) -> 'TSpN' (-33) -> 'TAvi' (-38) -> 'TMrk' (-34) -> xfer ( +-28)

Note that there can be coupling between streams (as shown from 'TSpN' (-33) to two places in the 'TDif' (-8) to xfer (-12) stream), but no loops.

What I've not been able to get my head around is generating some equivelent diagram programaticly. Are there modules around to help with this sort of graphing problem, or is there a way of representing the data that makes the graph "easy" to generate?

At present my internal data format is best represented by @splitLines in the following code fragment (assuming the data shown above is in a __DATA__ section):

use warnings; use strict; my @lines = <DATA>; my @splitLines = map {[/('....')..([-\d]*)\) -> ('?....'?)..([-\d]*)/] +} @lines; print "$_->[0] ($_->[1]) -> $_->[2] ($_->[3])\n" for @splitLines;

This simply reproduces the data above in the same form having parsed it.

In general there are likely to be up to a couple of hundred data lines with up to 17 inputs and 17 outputs.

I appologise for not presenting any half working code. My efforts so far have been less than useful. Hints for solving this problem will be greatly appreciated!


DWIM is Perl's answer to Gödel