Perl & Graphs

Pavel Zaitsev pavel at md5.ca
Fri Sep 20 11:33:09 CDT 2002


Hi,
Might be OT, but it is used in doxygen to draw very very nice
graphs of C++ and Java code. Wish there would be something
like that for perl. I leared code base of 100,000 in 2 weeks.
p.

abez(abez at abez.ca)@Thu, Sep 19, 2002 at 11:09:31PM -0700:
> Might be useful to someone.
> 
> vcg as well as AT&T graphviz are both great software packages such 
> that you can easily create graphs from a list of defined nodes and 
> edges.
> 
> These apps are great as it simplies making a graph down to just declaring
> nodes and edges. BANG the graph is plotted for you!
> 
> Here's a quick script to convert from .vcg to .dot . It won't work for
> everything but it works for the .vcgs I produced.
> 
> #!/usr/bin/perl
> my ($file1) = @ARGV;
> my @out = ();
> if ($file1) {
> 	open(FILE,$file1);
> 	@out = <FILE>;
> 	close(FILE);
> } else {
> 	@out = <STDIN>;
> }
> my $title = "graph";
> my @nodes = ();
> my @edges = ();
> foreach my $line (@out) {
> 	if ($line =~ /^\s*title:\s+"(.*)"\s*$/) {
> 		$title = $1;
> 	} elsif ($line =~ /^\s*node:\s*\{\s*title:\s+"(.*)"\s*\}\s*$/) {
> 		push @nodes,$1;
> 	} elsif ($line =~
> /^\s*edge:\s*\{\s*sourcename:\s+"(.*)"\s*targetname:\s+"(.*)"\s*\}\s*$/) {
> 		push @edges,[$1,$2];
> 	}
> }
> print "digraph $title \{\n";
> foreach my $node (@nodes) {
> 	print "\"$node\";\n";
> }
> foreach my $edge (@edges) {
> 	print "\"".$edge->[0] ."\" -> \"".$edge->[1]."\";\n";
> }
> print "}\n";
> 
> 
> Here's an AT&T graphviz graph detailing dependencies of gawk .c files,
> if you're in SENG420 this term these 2 graphs are copyright Abram Hindle so
> don't copy them (sorry I have to cover myself).
> 
> (c) 2002 Abram Hindle.
> 
> digraph TITLE {
> "re.c";
> "gawkmisc.c";
> "eval.c";
> "field.c";
> "missing.c";
> "version.c";
> "node.c";
> "builtin.c";
> "regex.c";
> "msg.c";
> "array.c";
> "awktab.c";
> "main.c";
> "getopt.c";
> "alloca.c";
> "getopt1.c";
> "random.c";
> "dfa.c";
> "io.c";
> "array.c" -> "array.c";
> "array.c" -> "awktab.c";
> "array.c" -> "dfa.c";
> "array.c" -> "eval.c";
> "array.c" -> "field.c";
> "array.c" -> "io.c";
> "array.c" -> "main.c";
> "awktab.c" -> "array.c";
> "awktab.c" -> "awktab.c";
> "awktab.c" -> "builtin.c";
> "awktab.c" -> "dfa.c";
> "awktab.c" -> "eval.c";
> "awktab.c" -> "field.c";
> "awktab.c" -> "getopt.c";
> "awktab.c" -> "io.c";
> "awktab.c" -> "main.c";
> "awktab.c" -> "msg.c";
> "awktab.c" -> "node.c";
> "awktab.c" -> "random.c";
> "awktab.c" -> "re.c";
> "awktab.c" -> "regex.c";
> "awktab.c" -> "version.c";
> "builtin.c" -> "awktab.c";
> "builtin.c" -> "builtin.c";
> "builtin.c" -> "eval.c";
> "builtin.c" -> "main.c";
> "builtin.c" -> "node.c";
> "builtin.c" -> "re.c";
> "dfa.c" -> "alloca.c";
> "dfa.c" -> "array.c";
> "dfa.c" -> "awktab.c";
> "dfa.c" -> "builtin.c";
> "dfa.c" -> "dfa.c";
> "dfa.c" -> "eval.c";
> "dfa.c" -> "field.c";
> "dfa.c" -> "gawkmisc.c";
> "dfa.c" -> "getopt.c";
> "dfa.c" -> "getopt1.c";
> "dfa.c" -> "io.c";
> "dfa.c" -> "main.c";
> "dfa.c" -> "msg.c";
> "dfa.c" -> "node.c";
> "dfa.c" -> "random.c";
> "dfa.c" -> "re.c";
> "dfa.c" -> "regex.c";
> "dfa.c" -> "version.c";
> "eval.c" -> "array.c";
> "eval.c" -> "eval.c";
> "eval.c" -> "field.c";
> "eval.c" -> "getopt.c";
> "eval.c" -> "io.c";
> "eval.c" -> "main.c";
> "eval.c" -> "re.c";
> "eval.c" -> "regex.c";
> "field.c" -> "awktab.c";
> "field.c" -> "eval.c";
> "field.c" -> "field.c";
> "field.c" -> "getopt.c";
> "field.c" -> "io.c";
> "field.c" -> "main.c";
> "gawkmisc.c" -> "alloca.c";
> "gawkmisc.c" -> "dfa.c";
> "gawkmisc.c" -> "gawkmisc.c";
> "gawkmisc.c" -> "regex.c";
> "io.c" -> "alloca.c";
> "io.c" -> "array.c";
> "io.c" -> "awktab.c";
> "io.c" -> "builtin.c";
> "io.c" -> "eval.c";
> "io.c" -> "field.c";
> "io.c" -> "io.c";
> "io.c" -> "main.c";
> "io.c" -> "msg.c";
> "io.c" -> "re.c";
> "main.c" -> "alloca.c";
> "main.c" -> "array.c";
> "main.c" -> "awktab.c";
> "main.c" -> "builtin.c";
> "main.c" -> "dfa.c";
> "main.c" -> "eval.c";
> "main.c" -> "field.c";
> "main.c" -> "gawkmisc.c";
> "main.c" -> "getopt.c";
> "main.c" -> "getopt1.c";
> "main.c" -> "io.c";
> "main.c" -> "main.c";
> "main.c" -> "msg.c";
> "main.c" -> "node.c";
> "main.c" -> "random.c";
> "main.c" -> "re.c";
> "main.c" -> "regex.c";
> "main.c" -> "version.c";
> "msg.c" -> "alloca.c";
> "msg.c" -> "awktab.c";
> "msg.c" -> "builtin.c";
> "msg.c" -> "dfa.c";
> "msg.c" -> "eval.c";
> "msg.c" -> "field.c";
> "msg.c" -> "getopt.c";
> "msg.c" -> "io.c";
> "msg.c" -> "main.c";
> "msg.c" -> "missing.c";
> "msg.c" -> "msg.c";
> "msg.c" -> "node.c";
> "msg.c" -> "random.c";
> "msg.c" -> "re.c";
> "msg.c" -> "regex.c";
> "msg.c" -> "version.c";
> "node.c" -> "array.c";
> "node.c" -> "awktab.c";
> "node.c" -> "builtin.c";
> "node.c" -> "eval.c";
> "node.c" -> "field.c";
> "node.c" -> "io.c";
> "node.c" -> "main.c";
> "node.c" -> "node.c";
> "node.c" -> "re.c";
> "random.c" -> "builtin.c";
> "random.c" -> "eval.c";
> "random.c" -> "random.c";
> "random.c" -> "regex.c";
> "re.c" -> "alloca.c";
> "re.c" -> "awktab.c";
> "re.c" -> "builtin.c";
> "re.c" -> "dfa.c";
> "re.c" -> "eval.c";
> "re.c" -> "field.c";
> "re.c" -> "io.c";
> "re.c" -> "main.c";
> "re.c" -> "re.c";
> }
> 
> Here's the same thing in VCG:
> graph: {
> title: "TITLE"
> color: lightgray
> node: { title: "re.c" }
> node: { title: "gawkmisc.c" }
> node: { title: "eval.c" }
> node: { title: "field.c" }
> node: { title: "missing.c" }
> node: { title: "version.c" }
> node: { title: "node.c" }
> node: { title: "builtin.c" }
> node: { title: "regex.c" }
> node: { title: "msg.c" }
> node: { title: "array.c" }
> node: { title: "awktab.c" }
> node: { title: "main.c" }
> node: { title: "getopt.c" }
> node: { title: "alloca.c" }
> node: { title: "getopt1.c" }
> node: { title: "random.c" }
> node: { title: "dfa.c" }
> node: { title: "io.c" }
> edge: { sourcename: "array.c" targetname: "array.c"}
> edge: { sourcename: "array.c" targetname: "awktab.c"}
> edge: { sourcename: "array.c" targetname: "dfa.c"}
> edge: { sourcename: "array.c" targetname: "eval.c"}
> edge: { sourcename: "array.c" targetname: "field.c"}
> edge: { sourcename: "array.c" targetname: "io.c"}
> edge: { sourcename: "array.c" targetname: "main.c"}
> edge: { sourcename: "awktab.c" targetname: "array.c"}
> edge: { sourcename: "awktab.c" targetname: "awktab.c"}
> edge: { sourcename: "awktab.c" targetname: "builtin.c"}
> edge: { sourcename: "awktab.c" targetname: "dfa.c"}
> edge: { sourcename: "awktab.c" targetname: "eval.c"}
> edge: { sourcename: "awktab.c" targetname: "field.c"}
> edge: { sourcename: "awktab.c" targetname: "getopt.c"}
> edge: { sourcename: "awktab.c" targetname: "io.c"}
> edge: { sourcename: "awktab.c" targetname: "main.c"}
> edge: { sourcename: "awktab.c" targetname: "msg.c"}
> edge: { sourcename: "awktab.c" targetname: "node.c"}
> edge: { sourcename: "awktab.c" targetname: "random.c"}
> edge: { sourcename: "awktab.c" targetname: "re.c"}
> edge: { sourcename: "awktab.c" targetname: "regex.c"}
> edge: { sourcename: "awktab.c" targetname: "version.c"}
> edge: { sourcename: "builtin.c" targetname: "awktab.c"}
> edge: { sourcename: "builtin.c" targetname: "builtin.c"}
> edge: { sourcename: "builtin.c" targetname: "eval.c"}
> edge: { sourcename: "builtin.c" targetname: "main.c"}
> edge: { sourcename: "builtin.c" targetname: "node.c"}
> edge: { sourcename: "builtin.c" targetname: "re.c"}
> edge: { sourcename: "dfa.c" targetname: "alloca.c"}
> edge: { sourcename: "dfa.c" targetname: "array.c"}
> edge: { sourcename: "dfa.c" targetname: "awktab.c"}
> edge: { sourcename: "dfa.c" targetname: "builtin.c"}
> edge: { sourcename: "dfa.c" targetname: "dfa.c"}
> edge: { sourcename: "dfa.c" targetname: "eval.c"}
> edge: { sourcename: "dfa.c" targetname: "field.c"}
> edge: { sourcename: "dfa.c" targetname: "gawkmisc.c"}
> edge: { sourcename: "dfa.c" targetname: "getopt.c"}
> edge: { sourcename: "dfa.c" targetname: "getopt1.c"}
> edge: { sourcename: "dfa.c" targetname: "io.c"}
> edge: { sourcename: "dfa.c" targetname: "main.c"}
> edge: { sourcename: "dfa.c" targetname: "msg.c"}
> edge: { sourcename: "dfa.c" targetname: "node.c"}
> edge: { sourcename: "dfa.c" targetname: "random.c"}
> edge: { sourcename: "dfa.c" targetname: "re.c"}
> edge: { sourcename: "dfa.c" targetname: "regex.c"}
> edge: { sourcename: "dfa.c" targetname: "version.c"}
> edge: { sourcename: "eval.c" targetname: "array.c"}
> edge: { sourcename: "eval.c" targetname: "eval.c"}
> edge: { sourcename: "eval.c" targetname: "field.c"}
> edge: { sourcename: "eval.c" targetname: "getopt.c"}
> edge: { sourcename: "eval.c" targetname: "io.c"}
> edge: { sourcename: "eval.c" targetname: "main.c"}
> edge: { sourcename: "eval.c" targetname: "re.c"}
> edge: { sourcename: "eval.c" targetname: "regex.c"}
> edge: { sourcename: "field.c" targetname: "awktab.c"}
> edge: { sourcename: "field.c" targetname: "eval.c"}
> edge: { sourcename: "field.c" targetname: "field.c"}
> edge: { sourcename: "field.c" targetname: "getopt.c"}
> edge: { sourcename: "field.c" targetname: "io.c"}
> edge: { sourcename: "field.c" targetname: "main.c"}
> edge: { sourcename: "gawkmisc.c" targetname: "alloca.c"}
> edge: { sourcename: "gawkmisc.c" targetname: "dfa.c"}
> edge: { sourcename: "gawkmisc.c" targetname: "gawkmisc.c"}
> edge: { sourcename: "gawkmisc.c" targetname: "regex.c"}
> edge: { sourcename: "io.c" targetname: "alloca.c"}
> edge: { sourcename: "io.c" targetname: "array.c"}
> edge: { sourcename: "io.c" targetname: "awktab.c"}
> edge: { sourcename: "io.c" targetname: "builtin.c"}
> edge: { sourcename: "io.c" targetname: "eval.c"}
> edge: { sourcename: "io.c" targetname: "field.c"}
> edge: { sourcename: "io.c" targetname: "io.c"}
> edge: { sourcename: "io.c" targetname: "main.c"}
> edge: { sourcename: "io.c" targetname: "msg.c"}
> edge: { sourcename: "io.c" targetname: "re.c"}
> edge: { sourcename: "main.c" targetname: "alloca.c"}
> edge: { sourcename: "main.c" targetname: "array.c"}
> edge: { sourcename: "main.c" targetname: "awktab.c"}
> edge: { sourcename: "main.c" targetname: "builtin.c"}
> edge: { sourcename: "main.c" targetname: "dfa.c"}
> edge: { sourcename: "main.c" targetname: "eval.c"}
> edge: { sourcename: "main.c" targetname: "field.c"}
> edge: { sourcename: "main.c" targetname: "gawkmisc.c"}
> edge: { sourcename: "main.c" targetname: "getopt.c"}
> edge: { sourcename: "main.c" targetname: "getopt1.c"}
> edge: { sourcename: "main.c" targetname: "io.c"}
> edge: { sourcename: "main.c" targetname: "main.c"}
> edge: { sourcename: "main.c" targetname: "msg.c"}
> edge: { sourcename: "main.c" targetname: "node.c"}
> edge: { sourcename: "main.c" targetname: "random.c"}
> edge: { sourcename: "main.c" targetname: "re.c"}
> edge: { sourcename: "main.c" targetname: "regex.c"}
> edge: { sourcename: "main.c" targetname: "version.c"}
> edge: { sourcename: "msg.c" targetname: "alloca.c"}
> edge: { sourcename: "msg.c" targetname: "awktab.c"}
> edge: { sourcename: "msg.c" targetname: "builtin.c"}
> edge: { sourcename: "msg.c" targetname: "dfa.c"}
> edge: { sourcename: "msg.c" targetname: "eval.c"}
> edge: { sourcename: "msg.c" targetname: "field.c"}
> edge: { sourcename: "msg.c" targetname: "getopt.c"}
> edge: { sourcename: "msg.c" targetname: "io.c"}
> edge: { sourcename: "msg.c" targetname: "main.c"}
> edge: { sourcename: "msg.c" targetname: "missing.c"}
> edge: { sourcename: "msg.c" targetname: "msg.c"}
> edge: { sourcename: "msg.c" targetname: "node.c"}
> edge: { sourcename: "msg.c" targetname: "random.c"}
> edge: { sourcename: "msg.c" targetname: "re.c"}
> edge: { sourcename: "msg.c" targetname: "regex.c"}
> edge: { sourcename: "msg.c" targetname: "version.c"}
> edge: { sourcename: "node.c" targetname: "array.c"}
> edge: { sourcename: "node.c" targetname: "awktab.c"}
> edge: { sourcename: "node.c" targetname: "builtin.c"}
> edge: { sourcename: "node.c" targetname: "eval.c"}
> edge: { sourcename: "node.c" targetname: "field.c"}
> edge: { sourcename: "node.c" targetname: "io.c"}
> edge: { sourcename: "node.c" targetname: "main.c"}
> edge: { sourcename: "node.c" targetname: "node.c"}
> edge: { sourcename: "node.c" targetname: "re.c"}
> edge: { sourcename: "random.c" targetname: "builtin.c"}
> edge: { sourcename: "random.c" targetname: "eval.c"}
> edge: { sourcename: "random.c" targetname: "random.c"}
> edge: { sourcename: "random.c" targetname: "regex.c"}
> edge: { sourcename: "re.c" targetname: "alloca.c"}
> edge: { sourcename: "re.c" targetname: "awktab.c"}
> edge: { sourcename: "re.c" targetname: "builtin.c"}
> edge: { sourcename: "re.c" targetname: "dfa.c"}
> edge: { sourcename: "re.c" targetname: "eval.c"}
> edge: { sourcename: "re.c" targetname: "field.c"}
> edge: { sourcename: "re.c" targetname: "io.c"}
> edge: { sourcename: "re.c" targetname: "main.c"}
> edge: { sourcename: "re.c" targetname: "re.c"}
> }
> 
> -- 
> ABeZ------------ ------- ------ - ---------- -- ------------
> http://www.indexdirect.com/abez/ Abram Hindle (abez at abez.ca)
> ---- ------- ----------- ----------- - - ------ --------ABeZ
> 

-- 
Create like god, rule like a king, work like a slave.



More information about the Victoria-pm mailing list