### pairwise.pm package ### hydrotron (Jon G.) 2015-04-14 ### encapsulate methods for managing pairwise association maps. #!/usr/bin/perl use strict; use warnings; use Data::Dumper; package pairwise; #initialization & member methods sub new { my $self = {}; $self->{'map'} = {}; #empty hash $self->{'sort'} = 'dnc'; #sort order $self->{'sep'} = ','; #seperator character default comman $self->{'debug'} = ''; #debug tokens bless($self); return $self; } sub debug { my ( $self, $val ) = @_; $self->{'debug'} = $val if defined($val); return $self->{'debug'}; } sub reset { my ( $self, $val ) = @_; $self->{'map'} = {}; return ; } sub separator { my ( $self, $val ) = @_; $self->{'sep'} = $val if defined($val); return $self->{'sep'}; } # Print Methods sub map2str { my ($self ) = @_; my $str = ''; my $hashref = $self->{'map'}; foreach my $key (keys(%$hashref)){ #print "key=$key\n"; foreach my $val (keys(%{$hashref->{$key}})){ # line format= key,cnt,val\n $str .= $key; $str .= $self->{'sep'}; $str .= $self->{map}->{$key}->{$val}; $str .= $self->{'sep'}; $str .= $val; $str .= "\n"; } } if ($self->{'debug'} =~ m/map2str/) { $str .= "DEBUG" . "\n"; $str .= Dumper $self->{'map'}; } return $str; } #Add Key Value Pair sub addkvp { my ($self , $key , $val) = @_; my $res = '1'; if ( defined($val) && defined($key)) { $self->{'map'}->{$key}->{$val} ++ ; } else { $self->{'map'}->{$key}->{$val} = '1'; $res = '0'; } return $res; } sub assertkvps { my ($self , $map) = @_; my $res = '1'; if ( defined($map) ) { $self->{'map'} = $map ; } else { $res = '0'; } return $res; } #Remove Key Value Pair sub removekey { my ($self, $key ) = @_; my $is_reg = 0 ; if (exists $self->{map}->{$key}) { $is_reg = 1 ; delete $self->{map}->{$key}; } return $is_reg; } # Does Key exist sub is_registered { my ($self, $key ) = @_; my $is_reg = 0 ; if (exists $self->{map}->{$key}) { $is_reg = 1 ; } return $is_reg; } # List All Keys sub getkeys { my ($self, $key ) = @_; #my @reg; my @reg = keys(%{ $self->{map} }); return \@reg; } # get key value sub getvalue { my ($self, $key ) = @_; my @reg; if (exists $self->{'map'}->{$key}) { @reg = keys(%{ $self->{'map'}->{$key} }); } # else { print "no\n";} return \@reg; } sub gethash { my ($self) = @_; my $reg = $self->{map}; return $reg; } #non-uniq Key Value Pair sub nonuniqkvp { my ($self) = @_; my $hashref = $self->{map}; my $nonuniq = {}; foreach my $key (keys(%$hashref)){ foreach my $val (keys(%{$hashref->{$key}})){ if ($hashref->{$key}->{$val} gt 1) { $nonuniq->{$key}->{$val} = $hashref->{$key}->{$val}; } } } return $nonuniq; } #non-uniq Key Value Pair sub nonuniqkeys { my ($self) = @_; my $hashref = $self->{map}; my $nonuniq = {}; foreach my $key (keys(%$hashref)){ if (scalar(keys(%{$hashref->{$key}}) gt '1')) { $nonuniq->{$key} = $hashref->{$key}; } } return $nonuniq; } #Invert Key Value Pair sub invertkvp { my ($self) = @_; my $hashref = $self->{map}; my $revhash = {}; foreach my $key (keys(%$hashref)){ foreach my $val (keys(%{$hashref->{$key}})){ $revhash->{$val}->{$key} = $hashref->{$key}->{$val}; } } $self->{map} = $revhash; return; } 1;