App-digitdemog
view release on metacpan or search on metacpan
#!/usr/bin/perl
# ãã®ããã°ã©ã ã®ä½æè
: ä¸éå¯¿ä¹ bin4tsv@gmail.com Toshiyuki Shimono
use 5.030 ;
use warnings ;
use Getopt::Std ;
use Getopt::Long qw [ GetOptions :config bundling no_ignore_case pass_through ] ; # GetOptionsFromArray ] ;
#Getopt::Long::Configure qw [ bundling ] ; # 1æåã®ãªãã·ã§ã³ã«å¯¾ãã¦æå¹ãããããã¤ãªããããã
#Getopt::Long::Configure qw [ no_ignore_case ] ; # 大æåã¨å°æåãåºå¥ããã
#Getopt::Long::Configure qw [ pass_through ] ; # æ¾ããªãã£ã @ARGV ã®å¼æ°ãæ®ãã¦ãããã£ã½ããposix_defaultã®å¾ã§æ¸ããã¨(!)ã
use Term::ANSIColor qw/:constants color/ ; $Term::ANSIColor::AUTORESET = 1 ;
use Time::HiRes qw/gettimeofday tv_interval/ ; # 5.7.3ãã
use List::Util qw[ max min first sum0 uniq ] ;
use Encode qw [ decode_utf8 ] ;
GetOptions 'e=s' => \my@e , 'width=i' => \my$width ; # -e ã§æå®ããããã¿ã¼ã³ãä½åã§ãæ¾ãã
getopts '.:$:0:12:=b:g:n:o:q:u:w:y:L:R:S', \my%o ;
$o{o} //= 0 ; # æ¡ã®çªå·ã0ããå§ãã ãã¨ãããã©ã«ãã ãããã¯ã1ããå§ããããããã«ããã
my $dt_start = [ gettimeofday ] ;
my $optu0 = ($o{u}//'') eq 0 ;
my $optq0 = ($o{q}//'') eq 0 ;
my $optw0 = ($o{w}//'') eq 0 ;
my $oL2 = ($o{L}//'') eq 2 ; # $optL2 ã¯é·ãããã®ã§ãã¡ãã£ã¨ç¹ä¾çã«çããã¦ã¿ã
my $oL4 = ($o{L}//'') eq 4 ;
$o{'.'} //= 1 ;
$o{'$'} //= '$' ; # æåã®çµç«¯ã表ãè¨å·
binmode STDOUT, 'utf8' unless $optu0 ;
## å
·ä½ä¾ãæç¤ºãã -g ã«ã¤ãã¦ã®å¦ç
$o{g} //= 1 ; # ä¾ã¨ãã¦åãåºãããã«ãåé »åº¦ã«å¯¾ãã¦ä½åç°ãªãä¾ãä¿æãããã
my $sep = do { my $c = $o{g} =~s/\d//gr ; $c = decode_utf8 $c if ! $optu0 ; $c ne '' ? $c : '|' } ; # åºå表ã§ã®å
·ä½ä¾ã®åºåãæåã
$o{g} =~ s/\D//g ;
$o{g} = 1 if $o{g} eq '' ;
my $header ; # -1 ãæå®ããããèªã¿é£ã°ãã®å¯¾è±¡ã¨ãªãããä¸å¿ä¿ç®¡ã(2次æ
å ±ã¨ãã¦æ¨æºã¨ã©ã¼åºåã«åºãã)
## -y ã«ããé »åº¦ã®ãã£ã«ã¿ãªã³ã°ãããããã®æºå :
my @y_ranges = () ; # åºåãããå¤ã®ç¯å²ãæå®ãããå ´åã®æåãæå®ããã
# 次ã®2åã®é¢æ°ã¯ãåºåãã¹ãå¤ã®ç¯å²ããã£ã«ã¿ã¼ã®æ§ã«æå®ããã
& y_init () ;
sub y_init ( ) {
my @ranges = split /,/o , $o{y} // '' , -1 ;
grep { $_ = $_ . ".." . $_ unless m/\.\./ } @ranges ; # = split /,/ , $o{y} // '' , -1 ;
do { m/^(\d*)\.\.(\d*)/ ; push @y_ranges , [ $1||1 , $2||'Inf' ] } for @ranges ;
}
sub y_filter ( $ ) {
do { return not 0 if $_->[0] <= $_[0] && $_[0] <= $_->[1] } for @y_ranges ;
return @y_ranges ? not 1 : not 0 ; # æå®ãç¡ãã£ãå ´åã¯ã¨ã«ããçãè¿ãã
}
## ããããã¡ã¤ã³
sub main () ;
* main = $oL2 || $oL4 ? * bylen : * main_normal ; # <-- mainã®å®ç¾©ã¯ããã§ããã
& main ;
exit 0 ;
###
END {
exit if ($o{2}//'') eq 0 ;
my $rl = d3 ($. // 0) ; # read lines
my $procsec = tv_interval ${ dt_start } ;
my $out = "$rl line(s) read; ";
$out .= do { chomp $header ; "\"$header\" is the 1st line; " } if defined $header ;
$out .= sprintf '%0.6f seconds (digitdemog)', $procsec ; # ãã¾ã«ãã¤ã¯ãç§åä½ã®$procsecã15æ¡ãããã§è¡¨ç¤ºãããã®ã§sprintfã
say STDERR BOLD DARK ITALIC CYAN $out ;
}
##
## é·ãæ¯ã«æ°ããã¢ã¼ã : (å
¥åã®å
·ä½çãªå¤ãè¦ããã)
##
sub bylen ( ) {
$header = <> if $o{'='} ;
my %freq ; # åãè¡ãæ¥ããã©ããã®å¤å®ã«ä½¿ããæ°ãéè¨ãããã
my %M ; # æååé·ããã¨ã®æååæå°å¤ã¨æååæå¤§å¤ãæ ¼ç´ããã
my %Lfrq ; # æååé·ãã¨ã®é »åº¦
while ( <> ) {
chomp ;
s/\r$// unless $optw0 ;
$_ = decode_utf8 $_ unless $optu0 ;
next if $freq{$_} ++ && $o{1} ; # && ã®åå¾ã®é åºã«æ³¨æ
my $len = length $_ ;
$Lfrq{$len} ++ ;
$M{$len}[0] = $_ if ! defined $M{$len}[0] || $M{$len}[0] gt $_ ;
$M{$len}[1] = $_ if ! defined $M{$len}[1] || $M{$len}[1] lt $_ ;
next unless $oL4 ;
$M{$len}[2] = $_ if ! defined $M{$len}[2] ;
$M{$len}[3] = $_ ;
( run in 0.744 second using v1.01-cache-2.11-cpan-b9db842bd85 )