Bin-Data-1D
view release on metacpan or search on metacpan
scripts/digitdemog view on Meta::CPAN
#!/usr/bin/perl
use 5.014 ; use strict ; use warnings ; # the functions requires 5.10 for "state", 5.14 for srand.
use Getopt::Std ; getopts '12$:=p:q:u:LS', \my%o ;
use Math::Trig qw/pi/ ; # 5.4ãã
use Scalar::Util qw/looks_like_number/ ; # 5.7.3ãã
use Term::ANSIColor qw/:constants color/ ; $Term::ANSIColor::AUTORESET = 1 ;
use Time::HiRes qw/sleep usleep gettimeofday tv_interval/ ; # 5.7.3ãã
use Encode ;
#$SIG{INT} = sub { & info ; exit 130 } ;
my $time0 = [ gettimeofday ] ;
my ${binFlag} = 1 if defined $o{u} && $o{u} eq '0' ;
$o{'$'} //= 'end' ; # æåã®çµç«¯ã表ãè¨å·
$o{p} //= '' ; # æåãåãåãããã¿ã¼ã³ãæ£è¦è¡¨ç¾
binmode STDOUT, 'utf8' unless $binFlag ;
sub main () ;
* main = $o{L} ? * bylen : $o{S} ? * blanks : * normal ; # <-- mainã®å®ç¾©ã¯ããã§ããã
& main ;
exit 0 ;
# ã©ããªç¨®é¡ã®ç©ºç½ããæ°ããã¢ã¼ã:
sub blanks ( ) {
my $header = <> if $o{'='} ;
my %seen ; # åãè¡ãæ¥ããã©ããã®å¤å®ã«ä½¿ããæ°ãéè¨ãããã
my %counts ;
while ( <> ) {
next if $o{1} && $seen{$_} ++ ;
chomp ;
$_ = decode_utf8 $_ unless $binFlag ;
my @blanks = m/[[:blank:]]/g ; # <-- - perldoc perlrecharclassãperlunicode ãåç
§ããã®ãè¯ããã Unicodeæåããããã£
#print "XX" if @blanks ;
$counts { $_ } ++ for @blanks ;
}
for ( sort keys %counts ) {
print sprintf "U+%X %s:\t%d\n", ord ($_) , $_ , $counts { $_ } ;
}
}
# é·ãæ¯ã«æ°ããã¢ã¼ã:
sub bylen ( ) {
my $header = <> if $o{'='} ;
my %seen ; # åãè¡ãæ¥ããã©ããã®å¤å®ã«ä½¿ããæ°ãéè¨ãããã
my %M ; # æååé·ããã¨ã®æååæå°å¤ã¨æååæå¤§å¤ãæ ¼ç´ããã
my %frq ; # æååé·ãã¨ã®é »åº¦
while ( <> ) {
next if $o{1} && $seen{$_} ++ ;
chomp ;
$_ = decode_utf8 $_ unless $binFlag ;
my $len = length $_ ;
$frq{$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 $_ ;
$M{$len}[2] = $_ if ! $o{2} && ! defined $M{$len}[2] ;
$M{$len}[3] = $_ if ! $o{2} ;
}
print join ( "\t", map {UNDERLINE $_} qw[length freq min_str max_str] , ! $o{2} ? qw[first_str last_str ]:() ) , "\n" ;
for ( sort { $a <=> $b } keys %M ) { # æ°å¤ (æååã®é·ãã表ã)ã§ã½ã¼ã
my @t = @{ $M{$_} } ;
grep { defined $_ and $_ = qq['$_'] } @t unless defined $o{q} && $o{q} eq '0' ;
$t[1] = '' if $t[1] eq $t[0] ;
$t[2] = '' if defined $t[2] and $t[2] eq $t[0] || $t[2] eq $t[1];
$t[3] = '' if defined $t[3] and $t[3] eq $t[0] || $t[3] eq $t[1];
print join ( "\t" , $_ , $frq{$_}, @t ) , "\n" ;
}
}
# æ®éã®ã¢ã¼ã:
sub normal ( ) {
my %S ; # $S{$char}[$pos] ã®ããã«ä½¿ãã åºç¾åæ°ã®éè¨è¡¨
my $maxlen = 0 ; # æååã®æå¤§é·
my $header = <> if $o{'='} ;
my %seen ; # åãè¡ãæ¥ããã©ããã®å¤å®ã«ä½¿ããæ°ãéè¨ãããã
while ( <> ) {
next if $o{1} && $seen{$_} ++ ;
chomp ;
$_ = decode_utf8 $_ unless $binFlag ;
my @c = split /$o{p}/, $_ , 0 ; # <-- - åºåã
$S{ qq['$c[$_]'] }[ $_ ] ++ for 0 .. $#c ; # <-- ã¯ã©ã¼ãã¼ã·ã§ã³ãä»å ããããã«ããã
$S{ $o{'$'} } [ @c ] ++ ; # æååçµç«¯è¨å·ã®è¶³ãåãã
$maxlen = @c if $maxlen < @c ; # æå¤§é·ã®ä¿ç®¡
}
# åºå
print join ("\t" , map {UNDERLINE GREEN $_} '' , 1 .. $maxlen + 1 ) , "\n" ;
for ( sort {$a eq $o{'$'} ? 1 : ( length ($a) <=> length($b) || $a cmp $b ) } keys %S ){ # <-- ã½ã¼ãé ã«ã¯æ³¨æããã
my @tmp = map { $_ // 0 } @{ $S{$_} } [ 0 .. $maxlen ] ;
( run in 2.318 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )