# A single relation, useful for initial testing and debugging. 1-1 1-2
use diagnostics; use strict; use Vertex; use Edge; sub make_vertex($); sub make_edge($$$); if (1) {}; # Emacs Perl-mode does not like prototypes; indentation des +troyed. my ( @data, $i, $comment, $nr_edges, $nr_verteces ); my ( $v1, $v2 ); my ( @verteces, %verteces, @edges, %edges ); $comment = '#.*$'; while (<>) { my ( $vertex_1, $vertex_2, $edge, $key); $i++; s/$comment//; next if /^\s*$/; /^\s*(\S+)\s+(\S+)/; if (!$1 || !$2) { print STDERR "Non-valid data on line $i.\n"; next; } ($v1, $v2) = ($1, $2); $vertex_1 = $verteces{$v1}; if (!$vertex_1) { $vertex_1 = make_vertex($v1); $verteces{$v1} = $vertex_1; push @verteces, $vertex_1; } $vertex_2 = $verteces{$v2}; if (!$vertex_2) { $vertex_2 = make_vertex($v2); $verteces{$v2} = $vertex_2; push @verteces, $vertex_2; } $key = $v1 . '_' . $v2; $edge = $edges{$key}; if (!$edge) { $edge = make_edge($vertex_1, $vertex_2, $key); $edges{$key} = $edge; push @edges, $edge; } $vertex_1 -> add_edge_reference($edge); $vertex_2 -> add_edge_reference($edge); } $verteces[0] -> print_vertex(2); #-------------------------------------- # Subroutines and functions. sub make_vertex ($) { my ( $label ) = @_; return Vertex->new('x' => int(rand(100)), 'y' => int(rand(100)), 'label' => $label); } # make_vertex sub make_edge ($$$) { my ( $vertex_1, $vertex_2, $label ) = @_; return Edge->new('vertex_1' => $vertex_1, 'vertex_2' => $vertex_2, 'label' => $label ); } # make_vertex
package Vertex; use strict; sub new { my ($class, %params) = @_; bless { '_x' => $params{'x'} || 0, '_y' => $params{'y'} || 0, '_label' => $params{'label'} || '', '_edges' => {}, # Neighbouring verteces connected through an ed +ge. '_verteces' => {}, # Neighbouring verteces not connected through a +n edge. '_fx' => 0, '_fy' => 0, '_dx' => 0, '_dy' => 0, }, $class; } # new sub print_vertex { my ($class, $i) = @_; my $is; if (!defined($i)) { $is = ''; } else { $is = sprintf('%' . $i . 's', ''); } print $is, 'label=', $_[0]->{'_label'}, "\n"; print $is, 'x=' , $_[0]->{'_x'}, "\n"; print $is, 'y=' , $_[0]->{'_y'}, "\n"; print $is, 'fx=' , $_[0]->{'_fx'}, "\n"; print $is, 'fy=' , $_[0]->{'_fy'}, "\n"; my @tmp = keys %{$_[0]->{'_edges'}}; my $tmp; if ($#tmp >= 0) { print $is, 'Edges: (', 1+$#tmp, ") \n"; for $tmp ( @tmp ) { print " ", $tmp->query_label(), "\n"; ### ERROR OCCURS HERE. } } else { print $is, "No edges.\n"; } @tmp = keys %{$_[0]->{'_verteces'}}; if ($#tmp >= 0) { print $is, 'Verteces:', "\n"; for ( @tmp ) { print $is, " ", $_->query_label(), "\n"; } } else { print $is, "No verteces.\n"; } } # print_vertex # Only neighbours not connected through an edge should be added here. sub add_neighbour_reference { my ($self, @params) = @_; my $key; for $key ( @params ) { $self->{_neighbours}[$key] = 1; } } # add_neighbour sub add_edge_reference { my ($self, @params) = @_; my $key; for $key ( @params ) { $self->{_edges}{$key} = 1; } } # add_edge_references sub query_x { $_[0]->{_x}; } # query_x sub set_x { $_[0]->{_x} = $_[1] if defined($_[1]); } # set_x sub query_y { $_[0]->{_y}; } # query_y sub set_y { $_[0]->{_y} = $_[1] if defined($_[1]); } # set_y sub query_label { $_[0]->{_label}; } # query_label sub set_label { $_[0]->{_label} = $_[1] if defined($_[1]); } # set_label 1;
package Edge; use strict; sub new { my ($class, %params) = @_; bless { '_strength' => $params{'strength'} || 1, '_length' => $params{'length'} || 1, '_vertex_1' => $params{'vertex_1'} || 0, '_vertex_2' => $params{'vertex_2'} || 0, '_label' => $params{'label'} || '', }, $class; } # new sub print_edge { print 'label=' , $_[0]->{'_label'} , "\n"; print 'strength=', $_[0]->{'_strength'}, "\n"; print 'length=' , $_[0]->{'_length'} , "\n"; print 'vertex_1=', $_[0]->{'_vertex_1'}->query_label(), "\n"; print 'vertex_2=', $_[0]->{'_vertex_2'}->query_label(), "\n"; } # print_edge # ------------------------------------------------------------------ # Set functions. sub set_strength { $_[0]->{_strength} = $_[1] if defined($_[1]); } # set_strength sub set_length { $_[0]->{_length} = $_[1] if defined($_[1]); } # set_length sub set_label { $_[0]->{_label} = $_[1] if defined($_[1]); } # set_label sub set_vertex_1 { $_[0]->{_vertex_1} = $_[1] if defined($_[1]); } # set_vertex_1 sub set_vertex_2 { $_[0]->{_vertex_2} = $_[1] if defined($_[1]); } # set_vertex_2 sub set_verteces { $_[0]->{_vertex_1} = $_[1] if defined($_[1]); $_[0]->{_vertex_2} = $_[2] if defined($_[2]); } # set_verteces # ------------------------------------------------------------------ # Query functions. sub query_strength { $_[0]->{_strength}; } # query_strength sub query_length { $_[0]->{_length}; } # query_length sub query_label { $_[0]->{_label}; } # query_label sub query_vertex_1 { $_[0]->{_vertex_1}; } # query_vertex_1 sub query_vertex_2 { $_[0]->{_vertex_2}; } # query_vertex_2 sub query_verteces { ( $_[0]->{_vertex_1}, $_[0]->{_vertex_2} ); } # query_verteces 1;
In reply to Can't locate object method by mhc
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |