App-gapstat
view release on metacpan or search on metacpan
#!/usr/bin/perl
use 5.014 ; use warnings ;
use Time::HiRes qw [ gettimeofday tv_interval ] ;
my ${ dt_start } = [ gettimeofday ] ;
use Encode qw[ decode_utf8 encode_utf8 ] ;
use Getopt::Std ; getopts '@:=G:L:R:u:' , \my %o ;
use Term::ANSIColor qw[ color :constants ] ; $Term::ANSIColor::AUTORESET = 1 ;
use FindBin qw[ $Script ] ;
use List::Util qw[ min max uniq ] ;
use Scalar::Util qw [ dualvar ] ; # dualvar 㯠num, string ã®é ã§ããã
use utf8 ;
* d3 = exists $o{','} && $o{','} eq 0 ? sub{$_[0]} : sub { $_[0] =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/gr } ;
$/ = $o{R} ? "\r\n" : "\n" ; # å
¥åã®æ¹è¡æåã«é¢ãã¦ãWindowså½¢å¼ãªã -R 1 ãæå®ããããã¨ã«ãªãã
* decode = ($o{u}//'') ne 0 ? * decode_utf8 : sub ( $ ) { $_[0] } ;
binmode STDOUT , "utf8" unless ($o{u}//'') eq 0 ;
$o{'@'} //= 15 ; # ä½ç§ããã«ã¢ã©ã¼ã ãçºçãããã
my $help = 0 ; # ãªã³ã©ã¤ã³ãã«ãã®æé¢ã®è¡¨ç¤ºããããå¦ãã
my $readLines ; # èªã¿åã£ãè¡æ°
$SIG{INT} = sub { exit } ;
$SIG{ALRM} = sub {
my $n = $. =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/gr ; # 3æ¡ãã¨ã«åºåãã
say STDERR GREEN "$. lines read ($Script). " , scalar localtime ;
alarm $o{'@'} ;
} ;
alarm $o{'@'} ;
my %gd ; # Gap Distribution ééã®åºãã«ã¤ãã¦ã®åå¸ã $gd{ gap } ã§ éã®åºãã gap ã§ãããã®ã®ãé »åº¦ãæ ¼ç´ã
my %gw1 ; # w = Where ; ãããçºçããå ´æã®æå
my %gw2 ; # w = Where ; ãããæå¾ã«çºçããå ´æ(è¡çªå·)ã$gw2{gap} 㯠gapã®å¤§ããã®ééãæå¾ã«çãã両端ã®å ´æã¨å¤ã示ãã
my %g22 ; # $g2w{gap}ã«ããã大ããgapã®ééãçããæå¾ã®å ´æã®(å§ã¾ãã§ãªã)çµããã«ã¤ãã¦ã[w,v] ã§ç¤ºãã
# 以ä¸ã® lc ã¯ã longest chain .
our %lc ; # @{ $lc{Gap} } ã«ãããdualvar n,"w:s"ãä½å(n)ç¶ãããä½è¡ç®(w)ã®æåå(s)ãåGapã§nã¯åºæ¥ãã ã大ãã(é·ã)ããã
our %lc0 ; # @lc ãç®åºããããã®ã䏿çãªæ ¼ç´å ´æ
my $head = <> if $o{'='} ;
my $v1 ; # 1è¡ç®ã®å¤ãæ ¼ç´ããã
my $prev ; # ç´åã®è¡ã«ã¤ã㦠[ $. , $str ] ãæ ¼ç´ã (ãã ãã[ , ] 㯠dualvar ã§ããã
while( <> ) {
my $neof = 1 ; # æ¯è¡èªã¿åãçµãã£ãå ´åã®ãæå¾ã®å¦çãçµãã£ãã 1 ã«ãªãã
$_ = decode ($_) ;
s/\s//g ; # chomp ãããªãã¦è¯ããªã£ã¦ããã
y/ï¼-ï¼/0-9/ unless ($o{u}//'') eq 0 ;
my $gap = undef ; # ç´åã®è¡ã®å
容æ°å¤ã¨ã®å·®åãæ ¼ç´ããã
$v1 //= $_ ; # 1è¡ç®ã®å¤ãæ ¼ç´ããã
if ( defined $prev ) {
$gap = $_ - ($prev.'') ;
$gd { $gap } ++ ;
$gw1 { $gap } //= dualvar $prev , sprintf "%s ~ %s:%s" , $prev . '' , $. , $_ ; # <-- æ°æ®µéããªããã¼ã
$gw2 { $gap } = dualvar $prev , sprintf "%s ~ %s:%s" , $prev . '' , $. , $_ ;
# next if ($o{L}//'') eq 0 ;
#$g22 { $gap } = dualvar $. , $_ ; # ãã®å¤æ°ã¯ã2çªç®ã®åºå表ã®ããã®è¨ç®ã«ä½¿ãã
}
next if ($o{L}//'') eq 0 ;
my $str = $_ ;
sub d2 ($) {
my $m = min grep { $_ > $_[0] } keys %g22 ;
defined $m ? dualvar $.-$g22{$m} , sprintf "%g:%s",$g22{$m},$g22{$m} : dualvar -1+$., "1:$v1" ;
}
#if ( ! defined $gap ) { $lc0 {Inf} = dualvar 1 , "$.:$str" ; $gd {Inf} = 0 ; next } # $. ã®é¨å㯠1 ã§ãè¯ãããã <-- -
next if ! defined $gap ;
if ( $gd { $gap } == 1 ) { # ãããããã®ã®ã£ããã®å¤ã§ã®è¨é²ã 1 åã¤ã¾ãåãã¦ã ã£ãæ
#my $max = max grep { abs $gap >= $_ } map { abs $_ } keys %gd ; # max 颿°ã®å¯¾è±¡ã空ã§ããã°ãè¿ãå¤ã¯ undef ã¨ãªãã
#$lc0 { abs $gap } = defined $max ? $lc0 { $max } : $lc0{Inf} ; # if defined $max ;
$lc0 { abs $gap } //= & d2 ( abs $gap ) ;
#print RED $gap ;
}
ULOOP :
for ( uniq map { abs $_ } keys %gd ) {
if ( $_ < abs $gap && defined $lc0 { $_ } || $neof == 0 && defined $lc0 { $_ } ) {
sub se($$){ dualvar $_[0] , sprintf "%s ~ %s:%s" , $_[0].'', $_[1]+0, $_[1].'' } # 颿° start end ã®ã¤ãããæ¬¡ã§ãã使ããªãã®ã§ãããã«æ¸ããã
( run in 0.643 second using v1.01-cache-2.11-cpan-f56aa216473 )