Graph-Reader-TGF
view release on metacpan or search on metacpan
package Graph::Reader::TGF;
use base qw(Graph::Reader);
use strict;
use warnings;
use Encode qw(decode_utf8);
use Error::Pure qw(err);
our $VERSION = 0.04;
# Edge callback.
sub _edge_callback {
my ($self, $graph, $id1, $id2, $edge_label) = @_;
$graph->set_edge_attribute($id1, $id2, 'label', $edge_label);
return;
}
# Init.
sub _init {
my ($self, $param_hr) = @_;
$self->SUPER::_init();
if (exists $param_hr->{'edge_callback'}
&& defined $param_hr->{'edge_callback'}
&& ref $param_hr->{'edge_callback'} ne 'CODE') {
err "Parameter 'edge_callback' isn't reference to code.";
}
$self->{'edge_callback'} = $param_hr->{'edge_callback'};
if (exists $param_hr->{'vertex_callback'}
&& defined $param_hr->{'vertex_callback'}
&& ref $param_hr->{'vertex_callback'} ne 'CODE') {
err "Parameter 'vertex_callback' isn't reference to code.";
}
$self->{'vertex_callback'} = $param_hr->{'vertex_callback'};
return;
}
# Read graph subroutine.
sub _read_graph {
my ($self, $graph, $fh) = @_;
my $vertexes = 1;
while (my $line = decode_utf8(<$fh>)) {
chomp $line;
# End of vertexes section.
if ($line =~ m/^#/ms) {
$vertexes = 0;
next;
}
# Vertexes.
if ($vertexes) {
my ($id, $vertex_label) = split m/\s+/ms, $line, 2;
if (! defined $vertex_label) {
$vertex_label = $id;
}
$graph->add_vertex($id);
if ($self->{'vertex_callback'}) {
$self->{'vertex_callback'}->($self, $graph,
$id, $vertex_label);
} else {
$self->_vertex_callback($graph, $id,
$vertex_label);
}
# Edges.
} else {
my ($id1, $id2, $edge_label) = split m/\s+/ms, $line, 3;
$graph->add_edge($id1, $id2);
if ($self->{'edge_callback'}) {
$self->{'edge_callback'}->($self, $graph, $id1,
$id2, $edge_label);
} else {
$self->_edge_callback($graph, $id1, $id2,
$edge_label);
}
}
}
return;
}
# Vertex callback.
sub _vertex_callback {
my ($self, $graph, $id, $vertex_label) = @_;
$graph->set_vertex_attribute($id, 'label', $vertex_label);
return;
}
1;
__END__
=pod
=encoding utf8
=head1 NAME
Graph::Reader::TGF - Perl class for reading a graph from TGF format.
=head1 SYNOPSIS
use Graph::Reader::TGF;
my $obj = Graph::Reader::TGF->new;
my $graph = $obj->read_graph($tgf_file);
=head1 METHODS
=head2 C<new>
my $obj = Graph::Reader::TGF->new;
Constructor.
This doesn't take any arguments.
Returns Graph::Reader::TGF object.
=head2 C<read_graph>
my $graph = $obj->read_graph($tgf_file);
Read a graph from the specified file.
The argument can either be a filename, or a filehandle for a previously opened file.
Returns Graph object.
( run in 0.629 second using v1.01-cache-2.11-cpan-71847e10f99 )