Perl & Graphs

abez abez at abez.ca
Fri Sep 20 01:09:31 CDT 2002


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




More information about the Victoria-pm mailing list