App-gapstat
view release on metacpan or search on metacpan
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 ã®ã¤ãããæ¬¡ã§ãã使ããªãã®ã§ãããã«æ¸ããã
my $put = se $lc0{$_}, $prev ; # $lc0{gap}ã§[é£ç¶é·,æåã®å ´æ:æåã®å¤] ã$prevã¯[$.,$_]ãã¤ã¾ããè¿ãå¤ã¯ã[é£ç¶é·,åæ:åå¤ ~ çµæ:çµå¤]ã
if ( !defined $lc{$_} || $lc{$_}[0] < $put ) { @{ $lc{$_} } = ($put) } # $lc{$_}ãåå¨ããªããããã®ä¸èº«ãæ°ããé£ç¶é·ããçããªããlc0ã§ä¸æ¸ãã
#if ( !defined $lc{$_} || $lc{$_}[0] < $put ) { push @{ $lc{$_} } , ($put) }
#elsif ( $lc{$_}[0] == $put ) { push @{ $lc{$_} } , $put } # $lc{$_}ã®ä¸èº«ã«ã¤ãã¦ãé£ç¶é·ã $lc0{$_} ã«çãããªãã追å ããã
elsif ( $lc{$_}[0] >= $put ) { push @{ $lc{$_} } , $put }
undef $lc0 { $_ } ;
}elsif ( $_ >= abs $gap ) {
#$lc0 { $_ } = defined $lc0 { $_ } ? dualvar 1 + $lc0 { $_ } , $lc0 { $_ } : & d2 ($gap) ;
$lc0{$_} = defined $lc0{$_} ? dualvar 1+$lc0{$_} , $lc0{$_} : dualvar 2, ($prev+0).":".$prev ; #"$.:$str" ; # 0 ,
}
}
$g22 { $gap } = dualvar $. , $_ ; # ãã®å¤æ°ã¯ã2çªç®ã®åºå表ã®ããã®è¨ç®ã«ä½¿ãã
#$g22 { $gap } = dualvar $prev , $prev ;
$prev = dualvar $. , $_ and $neof = 0 or goto ULOOP if eof && $neof ; # and or xor ã¯ãããéããããã
} continue {
$prev = dualvar $. , $_ ; #
}
& gap1output unless ($o{G}//'') eq 0 ;
exit 0 if ($o{L}//'') eq 0 ;
sub f ($) { my $t = sprintf "%.12f" , $_[0] ; $t =~ s/\.?0*$//r } # 12æ¡ã«ãã¦ãæ«å°¾ããã®0ãåã
# åºå2. longest length 㨠max gap ####
say join "\t", map { UNDERLINE $_ } "|gap|<=" , "maxlen" , "line:content (length)" ;
for ( grep { $_ != "Inf" } sort { $a <=> $b } uniq map { abs $_ } keys %gd ) {
my @chains = defined $lc{$_} ? @{ $lc {$_} } : () ; # ããã ãã® $_ ã¤ã¾ã max abs gap ãæã¤ãã®ã®ããªã¹ããåãåºãã
#my $Length = defined $chains[0] ? $chains [0] +0 : "NA" ; # æ¬å½ã¯(ãã°ã£ã¦ãªããã°)ãã©ã®è¦ç´ ãåã£ã¦ãã¦ãè¯ãããã®æ°å¤é¨å(dualvar) ãåãåºããããã¯æé·é·ãã
my $Length = max map { $_ + 0 } @chains ;
say join "\t" , f $_ , $Length, map{ sprintf "%s (%g)", $_ , $_ } @chains ; # join ã®ä¸ã§ã¯ãããã¹ãã³ã³ãã¯ã¹ãã
}
sub gap1output () { # åºå1. Gapsã®åºå
say join "\t", map { UNDERLINE $_ } 'gap', 'freq' , 'first' , 'last (line:content by "start ~ end")' ;
for ( grep { $_ != "Inf" } sort { $a <=> $b } keys %gd ) {
say join "\t" , f $_ , $gd { $_ }, & ww ( $gw1{$_} , $gw2{$_} ) ;
}
}
# 颿° where ãã where
sub ww ( $$ ) {
my ($n1,$n2,$w1,$w2) = ( $_[0].'' , $_[1].'' , $_[0]+0, $_[1]+0 ) ;
return $w1 == $w2 ? "$w1:$n1" : "$w1:$n1\t$w2:$n2" ;
}
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 . " seconds in process" ;
}
## ãã«ãã®æ±ã
sub VERSION_MESSAGE {}
sub HELP_MESSAGE {
use FindBin qw[ $Script ] ;
$ARGV[1] //= '' ;
open my $FH , '<' , $0 ;
while(<$FH>){
s/\$0/$Script/g ;
print $_ if s/^=head1// .. s/^=cut// and $ARGV[1] =~ /^o(p(t(i(o(ns?)?)?)?)?)?$/i ? m/^\s+\-/ : 1;
}
close $FH ;
exit 0 ;
}
=encoding utf8
=head1 $0
æ¹è¡åºåãã§æ°å¤ãèªã¿åãã主ãªä½¿ãæ¹ã¯ãé£çªã§ãªãå ´æãè¦ã¤ããã
* æã大ããªç©ºã(æ´æ°ã®æãã¦ããç®æ)ãè¦ã¤ããã
* æãé·ãé£ç¶ãã(i.e.空ãã®ãªã) æ°ã®é£ç¶ãè¦ã¤ããã
2åã®åºå表ãåºåãããã
(1) 1çªç®ã®åºå表ã¯ãå
¨ã¦ã®è¡ãç´åã®è¡ã¨ãã©ãã ãã®æ°å¤ã®éãδããã£ããã«ã¤ãã¦ã®ãé »åº¦ã¨ããã®ããã«ãªã£ãä¾(æåã¨æå¾ã®åºç¾)ã表ãã
(2) 2çªç®ã®åºå表ã¯ããã®Î´ã«ã¤ãã¦ããããããªé¾å¤Î¸ã«å¯¾ãã¦ãδâ¦Î¸ã¨ãªã£ããã®ããä½è¡é£ç¶ãã¦åºç¾ãããããã§ããã ãé·ãé£ç¶ããä¾ã示ã(å®è£
ã¨ãã¦ä¸å®å
¨)ã
ãªãã·ã§ã³ :
-= : 1è¡ç®ãèªã¿é£ã°ãã
-G 0 : ã®ã£ãã(éé)ã®çµ±è¨è¡¨ãåºåããªãã(2çªç®ã®è¡¨ç¤ºãè¦ããããããã)
( run in 1.252 second using v1.01-cache-2.11-cpan-e1769b4cff6 )