Acrux
view release on metacpan or search on metacpan
lib/Acrux/Util.pm view on Meta::CPAN
nto Unix
qnx Unix
android Unix
dos Windows
MSWin32 Windows
os390 EBCDIC
os400 EBCDIC
posix-bc EBCDIC
vmesa EBCDIC
MacOS MacOS
VMS VMS
vos VOS
riscos RiscOS
amigaos Amiga
mpeix MPEiX
);
# Common
sub deprecated {
local $Carp::CarpLevel = 1;
$ENV{ACRUX_FATAL_DEPRECATIONS} ? croak @_ : carp @_;
}
sub dumper { Data::Dumper->new([@_])->Indent(1)->Sortkeys(1)->Terse(1)->Useqq(1)->Dump }
sub clone { dclone(shift) }
sub load_class {
my $class = shift // '';
return "Invalid class name: $class" unless $class =~ /^\w(?:[\w:]*\w)?$/;
return undef if $class->can('new') || eval "require $class; 1"; # Ok
return "Class $class not found" if $@ =~ /^Can't\s+locate/i; # Error
return $@; # Error
}
# Bytes and numbers
sub fbytes {
my $n = int(shift);
if ($n >= 1024 ** 3) {
return sprintf "%.3g GiB", $n / (1024 ** 3);
} elsif ($n >= 1024 ** 2) {
return sprintf "%.3g MiB", $n / (1024.0 * 1024);
} elsif ($n >= 1024) {
return sprintf "%.3g KiB", $n / 1024.0;
} else {
return "$n B"; # bytes
}
}
sub human2bytes {
my $h = shift || 0;
return 0 unless $h;
my ($bts, $sfx) = $h =~ /([0-9.]+)\s*([a-zA-Z]*)/;
return 0 unless $bts;
my $exp = HUMAN_SUFFIXES->{($sfx ? uc($sfx) : "B")} || 0;
return ceil($bts * (2 ** $exp));
}
sub humanize_duration {
my $msecs = shift || 0;
my $secs = int($msecs);
my $years = int($secs / (60*60*24*365));
$secs -= $years * 60*60*24*365;
my $days = int($secs / (60*60*24));
$secs -= $days * 60*60*24;
my $hours = int($secs / (60*60));
$secs -= $hours * 60*60;
my $mins = int($secs / 60);
$secs %= 60;
if ($years) { return sprintf("%d years %d days %s hours", $years, $days, $hours) }
elsif ($days) { return sprintf("%d days %s hours %d minutes", $days, $hours, $mins) }
elsif ($hours) { return sprintf("%d hours %d minutes %d seconds", $hours, $mins, $secs) }
elsif ($mins >= 2) { return sprintf("%d minutes %d seconds", $mins, $secs) }
elsif ($secs > 5) { return sprintf("%d seconds", $secs + $mins * 60) }
elsif ($msecs - $secs) { return sprintf("%.4f seconds", $msecs) }
return sprintf("%d seconds", $secs);
}
sub fduration {
my $msecs = shift || 0;
my $secs = int($msecs);
my $hours = int($secs / (60*60));
$secs -= $hours * 60*60;
my $mins = int($secs / 60);
$secs %= 60;
if ($hours) {
return sprintf("%d hours %d minutes", $hours, $mins);
} elsif ($mins >= 2) {
return sprintf("%d minutes", $mins);
} elsif ($secs < 2*60) {
return sprintf("%.4f seconds", $msecs);
} else {
$secs += $mins * 60;
return sprintf("%d seconds", $secs);
}
}
sub humanize_number {
my $var = shift || 0;
my $sep = shift || "`";
1 while $var=~s/(\d)(\d\d\d)(?!\d)/$1$sep$2/;
return $var;
}
# Date and Time utils
sub fdate {
my $t = shift || time;
return strftime(DATE_FORMAT, localtime($t));
}
sub fdatetime {
my $t = shift || time;
return strftime(DATETIME_FORMAT, localtime($t));
}
sub parse_expire {
my $t = trim(shift(@_) // 0);
my %mult = (
's' => 1,
'm' => 60,
'h' => 60*60,
'd' => 60*60*24,
'w' => 60*60*24*7,
'M' => 60*60*24*30,
'y' => 60*60*24*365
);
if (!$t || (lc($t) eq 'now')) {
return 0;
} elsif ($t =~ /^\d+$/) {
return $t; # secs
} elsif ($t=~/^([+-]?(?:\d+|\d*\.\d*))([smhdwMy])/) {
return ($mult{$2} || 1) * $1;
}
return $t;
}
sub parse_time_offset {
my $s = trim(shift(@_) // 0);
return $s if $s =~ /^\d+$/;
my $r = 0;
my $c = 0;
while ($s =~ s/([+-]?(?:\d+|\d*\.\d*)[smhdMy])//) {
my $i = parse_expire("$1");
$c++ if $i < 0;
$r += $i < 0 ? $i*-1 : $i;
}
return $c ? $r*-1 : $r;
}
sub fdt {
my $f = shift || ''; # Format
my $t = shift || time(); # Time
my $g = shift || 0; # 0 - Local time; 1 - GMT time
my (@dt, %dth, %dth2);
@dt = $g ? gmtime($t) : localtime($t);
$dth{'%s'} = $dt[0] || 0;
$dth{'%ss'} = sprintf('%02d',$dth{'%s'});
$dth{'%_s'} = sprintf('%2d',$dth{'%s'});
$dth{'%m'} = $dt[1] || 0;
$dth{'%mm'} = sprintf('%02d',$dth{'%m'});
$dth{'%_m'} = sprintf('%2d',$dth{'%m'});
$dth{'%h'} = $dt[2] || 0;
$dth{'%hh'} = sprintf('%02d',$dth{'%h'});
$dth{'%_h'} = sprintf('%2d',$dth{'%h'});
$dth{'%D'} = $dt[3] || 0;
$dth{'%DD'} = sprintf('%02d',$dth{'%D'});
$dth{'%_D'} = sprintf('%2d',$dth{'%D'});
$dth{'%M'} = $dt[4] || 0; $dth{'%M'}++;
$dth{'%MM'} = sprintf('%02d',$dth{'%M'});
$dth{'%_M'} = sprintf('%2d',$dth{'%M'});
$dth{'%Y'} = $dt[5] || 0; $dth{'%Y'}+=1900;
$dth{'%YY'} = sprintf('%02d',$dth{'%Y'}%100);
$dth{'%YYY'} = sprintf('%03d',$dth{'%Y'}%1000);
$dth{'%YYYY'} = sprintf('%04d',$dth{'%Y'});
$dth{'%_Y'} = sprintf('%2d',$dth{'%Y'}%100);
$dth{'%_YY'} = sprintf('%3d',$dth{'%Y'}%1000);
$dth{'%w'} = DTF->{DOWS}->[$dt[6] || 0];
$dth{'%W'} = DTF->{DOW}->[$dt[6] || 0];
$dth{'%MON'} = DTF->{MOYS}->[$dt[4] || 0];
$dth{'%mon'} = DTF->{MOYS}->[$dt[4] || 0];
$dth{'%MONTH'} = DTF->{MOY}->[$dt[4] || 0];
$dth{'%month'} = DTF->{MOY}->[$dt[4] || 0];
# Second block
$dth2{'%G'} = 'GMT' if $g;
( run in 2.782 seconds using v1.01-cache-2.11-cpan-7fcb06a456a )