Gvizを Perlに移植しました
Yet Another Ruby Graphviz Interfaceを作ったからみんなで大量のグラフを作って遊ぼうよ!
DSLで DOTファイルが生成できるのがいいなぁと思ったのと、
Rubyの勉強を兼ねて移植してみました。
リポジトリ
Graph-Gvizじゃ目的がわからないという意見をいただいたので
モジュール名を変更しました。
https://github.com/syohex/p5-Graph-Gviz
syohex/p5-Graphviz-DSL · GitHub
CPANにアップするかどうかは類似モジュールの調査後に
します。少し調べた限りは DSLで書けるのがなさそうだったし、
依存モジュールがひたすら多そうなのばっかりなので、
アップする意義はあるかもと思っています。
サンプルコード
#!perl use strict; use warnings; use Graph::Gviz; my $graph = graph { route main => [qw/init parse cleanup printf/]; route init => 'make', parse => 'execute'; route execute => [qw/make compare printf /]; }; print "$graph"; # $graph->save(path => 'sample', type => 'png', encoding => 'utf-8');
これで以下のような DOTファイルが生成されます。
digraph G { main; init; parse; cleanup; printf; make; execute; compare; main -> init; main -> parse; main -> cleanup; main -> printf; init -> make; parse -> execute; execute -> make; execute -> compare; execute -> printf; }
オリジナルとの比較
オリジナルで上記と同じことをすると以下のようになります。
require "gviz" gv = Gviz.new gv.graph do route :main => [:init, :parse, :cleanup, :printf] route :init => :make, :parse => :execute route :execute => [:make, :compare, :printf] end gv.save(:sample1, :png)
Perlだとシンボルの部分がすべて文字列になってしまうので見苦しい
部分もありますが、結構近いんじゃないかなと思います。
実例
#!perl use strict; use warnings; use utf8; use Graph::Gviz; my %attr_heart = (label => ' ♥ ', fontcolor => 'red'); my $kimashi = graph { global bgcolor => 'powderblue'; nodes fillcolor => 'white', style => 'filled', fontsize => '16px'; route ['赤座あかり', '歳納京子', '吉川ちなつ', '船見結衣']; route ['池田千歳', '杉浦綾乃', '大室櫻子', '古谷向日葵']; edges fontsize => '24px'; route '吉川ちなつ' => '船見結衣'; route '歳納京子' => '吉川ちなつ'; edge '吉川ちなつ_船見結衣', %attr_heart; route '歳納京子' => '船見結衣'; edge '歳納京子_船見結衣', dir => 'both', label => ' ??? '; route '杉浦綾乃' => '歳納京子'; edge '杉浦綾乃_歳納京子', %attr_heart; route '池田千歳' => '杉浦綾乃'; edge '池田千歳_杉浦綾乃', dir => 'both', label => ' ??? '; route '大室櫻子' => '古谷向日葵'; edge '大室櫻子_古谷向日葵', dir => 'both', %attr_heart; }; $kimashi->save(path => 'yuruyuri', type => 'png', encoding => 'utf-8');