File Coverage

blib/lib/Scalar/Cmp.pm
Criterion Covered Total %
statement 52 52 100.0
branch 38 38 100.0
condition 38 42 90.4
subroutine 7 7 100.0
pod 3 3 100.0
total 138 142 97.1


line stmt bran cond sub pod time code
1             package Scalar::Cmp;
2              
3             our $DATE = '2018-12-06'; # DATE
4             our $VERSION = '0.002'; # VERSION
5              
6 1     1   55900 use 5.010001;
  1         13  
7 1     1   11 use strict 'subs', 'vars';
  1         3  
  1         37  
8 1     1   5 use warnings;
  1         1  
  1         34  
9              
10 1     1   5 use Scalar::Util qw(looks_like_number);
  1         1  
  1         452  
11              
12             require Exporter;
13             our @ISA = qw(Exporter);
14             our @EXPORT_OK = qw(
15             cmp_scalar
16             cmpnum_scalar
17             cmpstrornum_scalar
18             );
19              
20             sub cmp_scalar {
21 18     18 1 1095 my ($d1, $d2) = @_;
22              
23 18         27 my $def1 = defined $d1;
24 18         19 my $def2 = defined $d2;
25 18 100 100     94 if ( $def1 && !$def2) { return 1 }
  2 100 100     8  
    100 66        
26 2         7 elsif (!$def1 && $def2) { return -1 }
27 1         6 elsif (!$def1 && !$def2) { return 0 }
28              
29             # so both are defined ...
30              
31 13         18 my $ref1 = ref $d1;
32 13         16 my $ref2 = ref $d2;
33 13 100 100     42 if ($ref1 xor $ref2) { return 2 }
  3 100       10  
34 5 100       37 elsif ($ref1) { return $d1 == $d2 ? 0 : 2 }
35              
36             # so both are not references ...
37              
38 10         18 $d1 cmp $d2;
39             }
40              
41             sub cmpnum_scalar {
42 16     16 1 2437 my ($d1, $d2) = @_;
43              
44 16         22 my $def1 = defined $d1;
45 16         18 my $def2 = defined $d2;
46 16 100 100     87 if ( $def1 && !$def2) { return 1 }
  2 100 100     8  
    100 66        
47 2         7 elsif (!$def1 && $def2) { return -1 }
48 1         4 elsif (!$def1 && !$def2) { return 0 }
49              
50             # so both are defined ...
51              
52 11         16 my $ref1 = ref $d1;
53 11         15 my $ref2 = ref $d2;
54 11 100 100     36 if ($ref1 xor $ref2) { return 2 }
  3 100       10  
55 5 100       27 elsif ($ref1) { return $d1 == $d2 ? 0 : 2}
56              
57             # so both are not references ...
58              
59 8         13 $d1 <=> $d2;
60             }
61              
62             sub cmpstrornum_scalar {
63 18     18 1 2277 my ($d1, $d2) = @_;
64              
65 18         25 my $def1 = defined $d1;
66 18         18 my $def2 = defined $d2;
67 18 100 100     98 if ( $def1 && !$def2) { return 1 }
  2 100 100     7  
    100 66        
68 2         7 elsif (!$def1 && $def2) { return -1 }
69 1         5 elsif (!$def1 && !$def2) { return 0 }
70              
71             # so both are defined ...
72              
73 13         22 my $ref1 = ref $d1;
74 13         16 my $ref2 = ref $d2;
75 13 100 100     42 if ($ref1 xor $ref2) { return 2 }
  3 100       11  
76 5 100       24 elsif ($ref1) { return $d1 == $d2 ? 0 : 2 }
77              
78             # so both are not references ...
79              
80 5         14 my $llnum1 = looks_like_number($d1);
81 5         8 my $llnum2 = looks_like_number($d2);
82 5 100 66     37 $llnum1 && $llnum2 ? ($d1 <=> $d2) : ($d1 cmp $d2);
83             }
84              
85             1;
86             # ABSTRACT: Compare two scalars
87              
88             __END__