App-ctransition
view release on metacpan or search on metacpan
ctransition view on Meta::CPAN
#!/usr/bin/perl
use 5.014 ; use warnings ;
use Time::HiRes qw [ gettimeofday tv_interval ] ;
my ${ dt_start } = [ gettimeofday ] ;
use Getopt::Std ; getopts '~=@:0:2:l:q:' , \my %o ;
use Term::ANSIColor qw[ color :constants ] ; $Term::ANSIColor::AUTORESET = 1 ;
use FindBin qw[ $Script ] ;
use Encode qw[ decode_utf8 encode_utf8 ] ;
* d3 = exists $o{','} && $o{','} eq 0 ? sub{$_[0]} : sub { $_[0] =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/gr } ;
my $time0 = time ;
my $help = 0 ; # ãªã³ã©ã¤ã³ãã«ãã®æé¢ã®è¡¨ç¤ºããããå¦ãã
my $head ;
$o{i} //= "\t" ;
my $readLines = 0 ; # èªã¿åã£ãè¡æ°
my $optL0 = ($o{l}//'') eq 0 ? 1 : 0 ;
$o{'@'} //= 15 ; # ä½ç§ããã«ã¢ã©ã¼ã ãçºçãããã
$o{0} //= '-' ; # åºå表ã«ããã¦ãé »åº¦ã 0 ã®å ´åã«ãã©ããªå¤ãåºåãããã表ãã
$o{q} //= "'" ; # åºåããæåãåå¾ã§å²ãæåã
binmode STDOUT, ":utf8" ;
$SIG{INT} = sub { exit } ;
$SIG{ALRM} = sub {
my $n = $. =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/gr ; # 3æ¡ãã¨ã«åºåãã
say STDERR GREEN "$n lines read ($Script). " , scalar localtime ;
alarm $o{'@'}
} ;
alarm $o{'@'} ;
my %nn ; # $nn{ $prev } { $post } ã§é »åº¦ã§ããã
my %n2 ; # $post ãæ ¼ç´ãã(ã²ã¨ã¾ãã®å®ç¾©)ãä»ã®æå³ã¥ããä»ã®ç¨éã¯èããããã§ãããã
do { $_ = <> ; chomp ; $head = $_ } if $o{'='} ;
my $z = 'start' ; # ç´åã®æåã¨ãã¦æ ¼ç´ã
my $end = 'end' ; # æå¾ã表ãæå End Char
while( <> ) {
$readLines ++ ;
do { chomp ; $z = 'start' } if ! $optL0 ; # è¡ãæèããå ´åã
$_ = decode_utf8 $_ ;
my @chars = split // , $_ , 0 ;
for ( @chars ) {
$_ = '$/' if $_ eq $/ ;
$o{'~'} ? ++ $nn {$_} {$z} && ++ $n2 {$z} : ++ $nn {$z} {$_} && ++ $n2 {$_} ; # ããªããã¼ããã
$z = $_ ;
}
do { $o{'~'} ? ++$nn{$end}{$z} && ++$n2{$z} : ++$nn{$z}{$end} && ++$n2{$end} } if ! $optL0 ; # è¡ãæèããå ´å
}
do { $o{'~'} ? ++$nn{$end}{$z} && ++$n2{$z}: ++$nn{$z}{$end} && ++$n2{$end} } if $optL0 ; # è¡ãæèããªãå ´å
my @keg1 = sort { &conv($a) cmp &conv($b) } keys %nn ;
my @keg2 = sort { &conv($a) cmp &conv($b) } keys %n2 ;
use utf8 ;
say UNDERLINE join "\t" , ($o{'~'} ? 'âprev' : 'prevâ') , map { & conv($_) } @keg2 ;
for my $k ( @keg1 ) {
say join "\t" , & conv($k) , map { $nn { $k } { $_ } // $o{0} } @keg2 ;
}
say join "\t" , "total" , map { $n2 { $_ } // $o{0} } @keg2 ;
exit ;
sub conv ( $ ) {
return $_[0] = '"\t"' if $_[0] eq "\t" ;
return $_[0] = '"\n"' if $_[0] eq "\n" ;
return $_[0] if length $_[0] > 1 ;
return "$o{q}$_[0]$o{q}" ;
}
END{
exit if $help ;
my $procsec = sprintf "%.5f", tv_interval ${ dt_start } ; #time - $time0 ; # ãã®ããã°ã©ã ã®å¦çã«ããã£ãç§æ°ãæ¯è¼ãã2åã®æå»ã¯ç§åä½ãªã®ã§ã±1ç§æªæºã®èª¤å·®ã¯çºçããã
$readLines //= $. ; # Ctrl+Cã®é£æã§å¿
è¦ã¨ãªãå¦çã
return if ($o{2}//'') eq 0 ;
my $linenumeral = $readLines > 1 ? 'lines' : 'line' ;
print STDERR BOLD FAINT ITALIC & d3 ( $readLines ) . " $linenumeral read. " ;
my $s = tv_interval $dt_start , [ gettimeofday ] ;
say STDERR BOLD FAINT ITALIC " -- $Script ; " . $procsec . " sec. in process" ;
say STDERR BOLD FAINT ITALIC $head if defined $head ;
}
## ãã«ãã®æ±ã
( run in 1.591 second using v1.01-cache-2.11-cpan-140bd7fdf52 )