File Coverage

blib/lib/Algorithm/HowSimilar.pm
Criterion Covered Total %
statement 53 53 100.0
branch 7 8 87.5
condition 3 6 50.0
subroutine 14 14 100.0
pod 1 1 100.0
total 78 82 95.1


line stmt bran cond sub pod time code
1             package Algorithm::HowSimilar;
2              
3 1     1   18491 use 5.006;
  1         3  
  1         44  
4 1     1   6 use strict;
  1         2  
  1         38  
5 1     1   5 use warnings;
  1         6  
  1         47  
6 1     1   7030 use Algorithm::Diff qw(traverse_sequences);
  1         25536  
  1         101  
7 1     1   14 use Carp;
  1         2  
  1         84  
8             require Exporter;
9 1     1   5 use vars qw( @ISA @EXPORT_OK $VERSION );
  1         2  
  1         1960  
10             our @ISA = qw(Exporter);
11             @EXPORT_OK = qw( compare );
12             $VERSION = '0.01';
13              
14             sub compare {
15 8 100   8 1 2653 my $is_array = ref $_[0] eq 'ARRAY' ? 1 : 0;
16 8         9 my $i = 0;
17 8 100       14 if ( $is_array ) {
18 3         5 my $seq1 = $_[0];
19 3         6 my $seq2 = $_[1];
20 3         6 my (@match,@d1, @d2) = ((),(),());
21             traverse_sequences( $seq1, $seq2, {
22 20     20   559 MATCH => sub { push @match, $seq1->[$_[0]] },
23 4     4   28 DISCARD_A => sub { push @d1, $seq1->[$_[0]] },
24 9     9   38 DISCARD_B => sub { push @d2, $seq2->[$_[1]] },
25 3         32 });
26 3         42 my $m1 = @match/(@match+@d1);
27 3         7 my $m2 = @match/(@match+@d2);
28 3         10 my $mav = ($m1+$m2)/2;
29 3         19 return $mav, $m1, $m2, \@match, \@d1, \@d2;
30             }
31             else {
32 5         6 my ( $seq1, $seq2 );
33 5 100 66     18 if ( $_[2] and ref $_[2] eq 'CODE' ) {
34 1         3 local $_ = $_[0]; $seq1 = &{$_[2]};
  1         2  
  1         3  
35 1         11 local $_ = $_[1]; $seq2 = &{$_[2]};
  1         1  
  1         3  
36 1 50 33     16 carp "Did not get an array ref from callback!\n"
37             unless ref $seq1 eq 'ARRAY' and ref $seq2 eq 'ARRAY';
38             }
39             else {
40 4         10 $seq1 = _tokenize($_[0]);
41 4         13 $seq2 = _tokenize($_[1]);
42             }
43 5         19 my ($match,$d1, $d2) = ('','','');
44             traverse_sequences( $seq1, $seq2, {
45 101     101   3382 MATCH => sub { $match .= $seq1->[$_[0]] },
46 11     11   67 DISCARD_A => sub { $d1 .= $seq1->[$_[0]] },
47 39     39   129 DISCARD_B => sub { $d2 .= $seq2->[$_[1]] },
48 5         58 });
49 5         48 my $m1 = length($match)/(length($match)+length($d1));
50 5         8 my $m2 = length($match)/(length($match)+length($d2));
51 5         19 my $mav = ($m1+$m2)/2;
52 5         43 return $mav, $m1, $m2, $match, $d1, $d2;
53             }
54              
55             }
56              
57 8     8   86 sub _tokenize { return [split //, $_[0]] }
58              
59             1;
60             __END__