Aion-Format
view release on metacpan or search on metacpan
lib/Aion/Format.pm view on Meta::CPAN
our $VERSION = "0.1.2";
require POSIX;
require Term::ANSIColor;
use Guard qw//;
use Exporter qw/import/;
our @EXPORT = our @EXPORT_OK = grep {
*{$Aion::Format::{$_}}{CODE} && !/^(_|(NaN|import)\z)/n
} keys %Aion::Format::;
#@category ÐÑвод ÑÑÑÑкÑÑÑ
use DDP qw//;
sub _extends_ddp_properties {
my ($properties) = @_;
+{
colored => 1,
deparse => 1,
show_unicode => 1,
show_readonly => 1,
print_escapes => 1,
show_refcount => 1,
show_memsize => eval { require Devel::Size; 1 },
caller_info => 1,
#output => 'stdout',
unicode_charnames => 1,
%$properties,
class => {
expand => "all",
inherited => "all",
show_reftype => 1,
%{$properties->{class}},
},
}
}
# p Ñ Ð¿ÑедÑÑÑановленнÑми опÑиÑми
sub p($;%) {
my ($arg, %properties) = @_;
%properties = %{_extends_ddp_properties(\%properties)};
DDP::p $arg, %properties
}
# np Ñ Ð¿ÑедÑÑÑановленнÑми опÑиÑми
sub np($;%) {
my ($arg, %properties) = @_;
%properties = %{_extends_ddp_properties(\%properties)};
DDP::np $arg, %properties
}
#@category ÐовÑÑки
# ÐовÑÑка Ð´Ð»Ñ STDERR
sub trapperr(&) {
my $sub = shift;
local *STDERR;
open STDERR, '>:utf8', \my $f; my $guard = Guard::guard { close STDERR };
$sub->();
undef $guard;
utf8::decode($f) unless utf8::is_utf8($f);
$f
}
# ÐовÑÑка Ð´Ð»Ñ STDOUT
sub trappout(&) {
my $sub = shift;
local *STDOUT;
open STDOUT, '>:utf8', \my $f; my $guard = Guard::guard { close STDOUT };
$sub->();
undef $guard;
utf8::decode($f) unless utf8::is_utf8($f);
$f
}
#@category ЦвеÑ
# ÐолоÑизиÑÑÐµÑ ÑекÑÑ escape-поÑледоваÑелÑноÑÑÑми: coloring("#{BOLD RED}ya#{}100!#RESET"), а заÑем - заменÑÐµÑ ÑоÑÐ¼Ð°Ñ sprintf-ом
sub coloring(@) {
my $s = shift;
$s =~ s!#\{(?<x>[\w \t]*)\}|#(?<x>\w+)!
my $x = $+{x};
$x = "RESET" if $x ~~ [qw/r R/];
Term::ANSIColor::color($x)
!nge;
sprintf $s, @_
}
# ÐеÑаÑÐ°ÐµÑ Ð² STDOUT вÑвод coloring
sub printcolor(@) {
print coloring @_
}
# ÐеÑаÑÐ°ÐµÑ Ð² STDERR вÑвод coloring
sub warncolor(@) {
print STDERR coloring @_
}
# ÐÐ»Ñ ÐºÑона: ÐиÑÐµÑ Ð² STDOUT
sub accesslog(@) {
print "[", POSIX::strftime("%F %T", localtime), "] ", coloring @_;
}
# ÐÐ»Ñ ÐºÑона: ÐиÑÐµÑ Ð² STDIN
sub errorlog(@) {
print STDERR "[", POSIX::strftime("%F %T", localtime), "] ", coloring @_;
}
#@category ÐÑеобÑазованиÑ
# ÐÑÐ¾Ð²Ð¾Ð´Ð¸Ñ ÑооÑвеÑÑÑвиÑ
#
# replace "...", qr/.../ => sub {...}, ...
#
sub matches($@) { goto &replace }
sub replace($@) {
my $s = shift;
my $i = 0;
my $re = join "\n| ", map { $i++ % 2 == 0? "(?<I$i> $_ )": () } @_;
my $arg = \@_;
my $fn = sub {
for my $k (keys %+) {
return $arg->[$k]->() if do { $k =~ /^I(\d+)\z/ and $k = $1 }
}
};
$s =~ s/$re/$fn->()/gex;
$s
}
lib/Aion/Format.pm view on Meta::CPAN
} @$templates;
qr/$x/xsmn
}
# ÑоÑмиÑÑÐµÑ ÑеловекоÑиÑабелÑнÑй инÑеÑвал
sub sinterval($) {
my ($interval) = @_;
if(0 == int $interval) {
return sprintf "%.6f mks", $interval*1000_000 if 0 == int($interval*1000_000);
return sprintf "%.7f ms", $interval*1000 if 0 == int($interval*1000);
return sprintf "%.8f s", $interval;
}
my $hours = int($interval / (60*60));
my $minutes = int(($interval - $hours*60*60) / 60);
my $seconds = int($interval - $hours*60*60 - $minutes*60);
my $last = sprintf "%.3f", $interval - $hours*60*60 - $minutes*60 - $seconds;
sprintf "%02i:%02i:%02i.%s", $hours, $minutes, $seconds, $last =~ s!^0\.!!r
}
#@category ЦиÑÑÑ
# пеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð² ÑимÑкÑÑ ÑиÑÑÐµÐ¼Ñ ÑÑиÑлениÑ
# N - нолÑ
# ЧеÑез каждÑÑ 1000 ÑÑавиÑÑÑ Ð¿Ñобел (ÑазделиÑÐµÐ»Ñ ÑазÑÑдов)
our @RIM_CIF = (
[ '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' ],
[ '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC' ],
[ '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM' ]
);
sub rim($) {
my ($a) = @_;
use bigint; $a+=0;
my $s;
for ( ; $a != 0 ; $a = int( $a / 1000 ) ) {
my $v = $a % 1000;
if ( $v == 0 ) {
$s = "M $s";
}
else {
my $d;
for ( my $i = 0, $d = "" ; $v != 0 ; $v = int( $v / 10 ), $i++ ) {
my $x = $v % 10;
$d = $RIM_CIF[$i][$x] . $d;
}
$s = "$d $s";
}
}
$s //= "N";
$s =~ s/ \z//;
$s
}
# ÐÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¸Ð· кодиÑовки cp1251, ÑÑо нÑжно Ð´Ð»Ñ ÐºÐ¾ÑÑекÑной запиÑи в ÑаблиÑÑ
our $CIF = join "", "0".."9", "A".."Z", "a".."z", "_-", # 64 Ñимвола Ð´Ð»Ñ 64-ÑиÑной ÑиÑÑÐµÐ¼Ñ ÑÑиÑлениÑ
(map chr, ord "Ð" .. ord "Я"), "ÐÐÐÐÐÐÐÐÐÐÒÐÐÐÐ
",
(map chr, ord "а" .. ord "Ñ"), "ÑÑÑÑÑÑÑÑÑÑÒÑÑÑÑ",
"âââ¦â â¡â¬â°â¹âââââ¢âââ¢âºÂ¤Â¦Â§Â©Â«Â¬Â®°±µ¶·â»", do { no utf8; chr 0xa0 }, # небÑквеннÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¸Ð· cp1251
"!\"#\$%&'()*+,./:;<=>?\@[\\]^`{|}~", # ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿ÑнкÑÑаÑии ASCII
" ", # пÑобел
(map chr, 0 .. 0x1F, 0x7F), # ÑпÑавлÑÑÑие ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ASCII
# Ñимвол 152 (0x98) в cp1251 оÑÑÑÑÑÑвÑеÑ.
;
# ÐеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð½Ð°ÑÑÑалÑное ÑиÑло в заданнÑÑ ÑиÑÑÐµÐ¼Ñ ÑÑиÑлениÑ
sub to_radix($;$) {
use bigint;
my ($n, $radix) = @_;
$radix //= 64;
die "to_radix: The number system $radix is too large. Use NS before " . (1 + length $CIF) if $radix > length $CIF;
$n+=0; $radix+=0;
my $x = "";
for(;;) {
my $cif_idx = $n % $radix;
my $cif = substr $CIF, $cif_idx, 1;
$x =~ s/^/$cif/;
last unless $n = int($n / $radix);
}
return $x;
}
# ÐаÑÑÐ¸Ñ Ð½Ð°ÑÑÑалÑное ÑиÑло в Ñказанной ÑиÑÑеме ÑÑиÑлениÑ
sub from_radix(@) {
use bigint;
my ($s, $radix) = @_;
$radix //= 64;
$radix+=0;
die "from_radix: The number system $radix is too large. Use NS before " . (1 + length $CIF) if $radix > length $CIF;
my $x = 0;
for my $ch (split "", $s) {
$x = $x*$radix + index $CIF, $ch;
}
return $x;
}
# ÐкÑÑглÑÐµÑ Ð´Ð¾ Ñказанного ÑазÑÑда ÑиÑла
sub round($;$) {
my ($x, $dec) = @_;
$dec //= 0;
my $prec = 10**$dec;
int($x*$prec + 0.5) / $prec
}
#@category ÐеÑÑ (measure)
# добавлÑÐµÑ ÑазделиÑели Ð¼ÐµÐ¶Ð´Ñ ÑазÑÑдами ÑиÑла
sub num($) {
my ($s) = @_;
my $sep = " "; # ÐеÑазÑÑвнÑй пÑобел
my $dec = ".";
($s, $sep, $dec) = @$s == 2? @$s: (@$s, $dec) if ref $s;
my ($x, $y) = split /\./, $s;
$y = "$dec$y" if defined $y;
$x = reverse $x;
( run in 1.264 second using v1.01-cache-2.11-cpan-39bf76dae61 )