File Coverage

blib/lib/Devel/Util.pm
Criterion Covered Total %
statement 16 95 16.8
branch 0 40 0.0
condition 1 15 6.6
subroutine 5 11 45.4
pod 4 4 100.0
total 26 165 15.7


line stmt bran cond sub pod time code
1             package Devel::Util;
2 1     1   1206 use strict;
  1         1  
  1         25  
3 1     1   4 use warnings;
  1         1  
  1         26  
4             # use Scalar::Util;
5             # use Time::HiRes;
6             # use POSIX;
7             # use Carp;
8              
9 1     1   4 use base 'Exporter';
  1         2  
  1         534  
10             our %EXPORT_TAGS = (
11             all => [ qw(
12             oiaw once_in_a_while
13             dt do_time
14             printr print_refresh
15             forked
16             tz timezone
17             ) ],
18             );
19             our @EXPORT_OK = ( @{ $EXPORT_TAGS{all} } );
20              
21             our $VERSION = '0.80';
22             our $QUIET;
23              
24             $Carp::Internal{(__PACKAGE__)} = 1;
25              
26             {
27             my $pid = $$;
28             sub forked () {
29 0     0 1 0 $pid != $$
30             }
31             }
32              
33             sub printr;
34             sub print_refresh;
35             *print_refresh = *printr = _printr();
36              
37             sub _printr {
38 1   50 1   9 my $fh = shift || \*STDERR;
39 1         1 my $former_str;
40 1         2 my $str_len = 0;
41             sub {
42 0 0   0     return if $QUIET;
43 0           my $str = shift;
44 0 0         $str = sprintf($str, @_) if @_;
45             # $str =~ s/[ \t]+$//;
46 0           $str =~ s/[\r\b]//g;
47 0           my $add_str;
48 0 0         if ($str =~ /\n/) {
49 0           ($str, $add_str) = split(/\n/, $str, 2);
50             }
51 0           my $tr = $str_len - length($str);
52 0 0         $str .= ' 'x$tr if $tr>0;
53 0           $str_len -= $tr;
54 0 0         if ($str =~ /[\b\r\n]/) {
55 0           print $fh "\r$str";
56 0           $str_len = length($str);
57 0           $former_str = '';
58             } else {
59 0 0         if ($former_str) {
60 0           ($str^$former_str) =~ /^(\0{0,255})/;
61 0           my $prefix_len = length($1);
62 0           my $postfix_len = length($former_str) - $prefix_len;
63 0           $former_str = $str;
64 0 0         if ($prefix_len > $postfix_len) {
65 0           $str = ("\b" x $postfix_len) . substr($str, $prefix_len)
66             } else {
67 0           $str = "\r$str";
68             }
69             } else {
70 0           $former_str = $str;
71 0           $str = "$str";
72             }
73 0           print $fh $str;
74 0 0         if ($tr>0) {
75 0           $former_str =~ s/ {$tr}$//;
76 0           print $fh "\b"x$tr;
77             }
78 0 0         if (defined $add_str) {
79 0           $former_str = $add_str;
80 0           $str_len = length($add_str);
81 0           print $fh "\n", $add_str;
82             }
83             }
84             }
85 1         7 }
86              
87             {
88 1     1   6 no warnings 'uninitialized';
  1         2  
  1         606  
89             my %last_times;
90             sub oiaw (&;$) {
91 0     0 1   require Time::HiRes;
92 0 0         if (defined wantarray) {
93 0           my $code = shift;
94 0   0       my $delay = shift || 1;
95 0           my $last_time = 0;
96             sub {
97 0 0 0 0     return unless Time::HiRes::time() - $last_time >= $delay || $_[0] && $_[0] eq '-force';
      0        
98 0           $last_time = Time::HiRes::time();
99 0           $code->(@_)
100             }
101 0           } else {
102 0           my (undef, $file, $line) = caller;
103 0 0 0       return if Time::HiRes::time() - $last_times{$file.$line} < ($_[1]||1);
104 0           $last_times{$file.$line} = Time::HiRes::time();
105 0           $_[0]->();
106 0           1
107             }
108             }
109             }
110              
111             sub tz (&$) {
112 0     0 1   require POSIX;
113 0           my ($block, $tz) = @_;
114 0           my (@ret, $ret);
115             {
116 0           local $ENV{TZ} = $tz;
  0            
117 0           POSIX::tzset();
118 0 0         if (wantarray) {
    0          
119 0           eval {@ret = $block->()}
  0            
120             }
121             elsif (defined wantarray) {
122 0           eval {$ret = $block->()}
  0            
123             }
124             else {
125 0           eval {$block->()}
  0            
126             }
127             }
128 0           POSIX::tzset();
129 0 0         die $@ if $@;
130 0 0         wantarray ? @ret : $ret
131             }
132              
133             {
134             my $timestr = sub {
135             my $d = shift;
136             $d = 0 if $d<0;
137             sprintf("%dm%.3fs", int($d/60), $d - 60*int($d/60))
138             };
139             sub dt (&;$) {
140 0     0 1   require Time::HiRes;
141 0           my $block = shift;
142 0   0       my $name = shift || sprintf 'dt at %s line %d', (caller)[1,2];
143 0           my ($t_elapsed_0, $t_elapsed_1, $t_user_0, $t_user_1, $t_sys_0, $t_sys_1);
144 0           my @ret;
145 0           my $ret;
146              
147 0           ($t_user_0, $t_sys_0) = times;
148 0           $t_elapsed_0 = Time::HiRes::time();
149 0 0         if (wantarray) {
    0          
150 0           @ret = $block->()
151             }
152             elsif (defined wantarray) {
153 0           $ret = $block->()
154             }
155             else {
156 0           $block->()
157             }
158 0           $t_elapsed_1 = Time::HiRes::time();
159 0           ($t_user_1, $t_sys_1) = times;
160              
161 0 0         printf STDERR ("\nTiming report for %s:\nreal %s\nuser %s\nsys %s\n\n",
162             $name,
163             $timestr->($t_elapsed_1 - $t_elapsed_0),
164             $timestr->($t_user_1 - $t_user_0),
165             $timestr->($t_sys_1 - $t_sys_0),
166             ) unless $QUIET;
167            
168 0 0         wantarray ? @ret : $ret
169             }
170             }
171              
172             sub do_time (&;$);
173             *do_time = \&dt;
174              
175             sub once_in_a_while (&;$);
176             *once_in_a_while = \&oiaw;
177              
178             sub timezone (&$);
179             *timezone = \&tz;
180              
181             1