File Coverage

blib/script/seq
Criterion Covered Total %
statement 49 68 72.0
branch 17 30 56.6
condition 2 3 66.6
subroutine 6 7 85.7
pod n/a
total 74 108 68.5


line stmt bran cond sub pod time code
1             #!/usr/local/bin/perl
2              
3             =encoding utf8
4              
5             =begin metadata
6              
7             Name: seq
8             Description: print a numeric sequence
9             Author: Michael Mikonos
10             License: artistic2
11              
12             =end metadata
13              
14             =cut
15              
16 5     5   23076 use strict;
  5         8  
  5         250  
17              
18 5     5   25 use File::Basename qw(basename);
  5         9  
  5         474  
19 5     5   2696 use POSIX qw(floor);
  5         35843  
  5         24  
20              
21 5     5   8523 use constant EX_SUCCESS => 0;
  5         17  
  5         647  
22 5     5   27 use constant EX_FAILURE => 1;
  5         7  
  5         10559  
23              
24 5         820281 my $Program = basename($0);
25              
26 5         16 my $begin = 1;
27 5         9 my $step = 1;
28 5         10 my $ender;
29 5         10 my $format = "%g";
30 5         13 my $term = "\n";
31              
32             sub usage {
33 0     0   0 warn "usage: $Program [-f format] [-s string] [begin [step]] end\n";
34 0         0 exit EX_FAILURE;
35             }
36              
37 5   66     63 while (@ARGV && $ARGV[0] =~ /^-/) {
38 4         9 my $opt = shift;
39 4 50       33 if ($opt eq '--') {
    100          
    100          
    50          
40 0         0 last;
41             } elsif ($opt eq '-s') {
42 1         5 $term = shift;
43             } elsif ($opt eq '-f') {
44 1         12 $format = shift;
45             } elsif ($opt =~ m/\A\-?[0-9]/) {
46 2         8 unshift @ARGV, $opt;
47 2         4 last;
48             } else {
49 0         0 warn "$Program: unexpected option: '$opt'\n";
50 0         0 usage();
51             }
52             }
53 5 50       40 if (@ARGV == 0) {
    50          
    100          
    50          
54 0         0 usage();
55             } elsif (@ARGV == 1) {
56 0         0 $ender = getnum($ARGV[0]);
57             } elsif (@ARGV == 2) {
58 3         15 $begin = getnum($ARGV[0]);
59 3         15 $ender = getnum($ARGV[1]);
60             } elsif (@ARGV == 3) {
61 2         10 $begin = getnum($ARGV[0]);
62 2         23 $step = getnum($ARGV[1]);
63 2         4 $ender = getnum($ARGV[2]);
64             } else {
65 0         0 warn "$Program: extra argument '$ARGV[3]'\n";
66 0         0 usage();
67             }
68              
69 5 50       17 if ($step == 0) {
70 0         0 warn "$Program: illegal step value of zero\n";
71 0         0 exit EX_FAILURE;
72             }
73 5 50       53 if ($ender < $begin) {
74 0 0       0 if (@ARGV != 3) {
    0          
75 0         0 $step = -$step;
76             } elsif ($step > 0) {
77 0         0 warn "$Program: needs negative decrement\n";
78 0         0 exit EX_FAILURE;
79             }
80             } else {
81 5 50       24 if ($step < 0) {
82 0         0 warn "$Program: needs positive increment\n";
83 0         0 exit EX_FAILURE;
84             }
85             }
86              
87 5         9 my $head = 1;
88 5         88 my $count = floor(($ender - $begin) / $step);
89 5         21 for (0 .. $count) {
90 43 100       63 if ($head) {
91 5         25 $head = 0;
92             } else {
93 38         44 print $term;
94             }
95 43         204 printf $format, $begin + $_ * $step;
96             }
97 5         10 print "\n";
98 5         0 exit EX_SUCCESS;
99              
100             sub getnum {
101 12     12   17 my $n = shift;
102 12 50       91 if ($n !~ m/\A[\+\-]?[0-9]+(\.[0-9]+)?\Z/) {
103 0         0 warn "$Program: invalid number '$n'\n";
104 0         0 exit EX_FAILURE;
105             }
106 12         21 return $n;
107             }
108              
109             __END__