File Coverage

blib/lib/Data/Decrement.pm
Criterion Covered Total %
statement 35 39 89.7
branch 15 18 83.3
condition n/a
subroutine 5 5 100.0
pod 1 1 100.0
total 56 63 88.8


line stmt bran cond sub pod time code
1             package Data::Decrement;
2              
3             our $DATE = '2019-01-26'; # DATE
4             our $VERSION = '0.002'; # VERSION
5              
6 1     1   66142 use strict;
  1         11  
  1         29  
7 1     1   5 use warnings;
  1         2  
  1         34  
8 1     1   5 use Carp;
  1         2  
  1         75  
9              
10 1     1   7 use Exporter qw(import);
  1         2  
  1         334  
11             our @EXPORT_OK = qw(decr);
12              
13             sub decr {
14 5     5 1 102 my $val = shift;
15              
16 5 50       15 return -1 unless defined $val;
17 5 100       29 return $val-1 unless $val =~ /^[a-zA-Z]*[0-9]*\z/;
18              
19 4         14 my @digits = split //, $val;
20 4         7 my $carry = 0;
21 4         12 for (my $i = $#digits; $i >= 0; $i--) {
22 12         22 my $digit = $digits[$i];
23 12 100       30 if ($digit eq 'a') {
    100          
    100          
24 2 50       6 do { carp "Cannot decrement '$val'"; return $val } unless $i;
  0         0  
  0         0  
25 2         3 $digit = 'z'; $carry++;
  2         12  
26             } elsif ($digit eq 'A') {
27 3 100       11 do { carp "Cannot decrement '$val'"; return $val } unless $i;
  1         223  
  1         11  
28 2         4 $digit = 'Z'; $carry++;
  2         3  
29             } elsif ($digit eq '0') {
30 4 50       10 do { carp "Cannot decrement '$val'"; return $val } unless $i;
  0         0  
  0         0  
31 4         5 $digit = '9'; $carry++;
  4         7  
32             } else {
33 3         8 $digit = chr(ord($digit)-1);
34             }
35 11         14 $digits[$i] = $digit;
36 11 100       27 last unless $carry--;
37             }
38              
39 3         16 join '', @digits;
40             }
41              
42             1;
43             # ABSTRACT: Provide extra magic logic for auto-decrement
44              
45             __END__