#!/usr/bin/perl use 5.014 ; use warnings ; use Getopt::Std ; getopts ":01bnuw" , \my%o ; use Term::ANSIColor qw[ :constants color ] ; $Term::ANSIColor::AUTORESET = 1 ; use utf8 ; binmode STDOUT , ":utf8" ; #if ! $o{b} ; use Encode qw [ decode_utf8 encode_utf8 ] ; use FindBin qw [ $Script ] ; my $sdt = sprintf '%04d-%02d-%02d %02d:%02d:%02d', do{my @t= @{[localtime]}[5,4,3,2,1,0]; $t[0]+=1900; $t[1]++; @t } ; eval "use Encode::JP qw[decode encode];1" or die "Encode::JP cannot be loaded, so -w does not work. ($Script, $sdt)\n" if $o{w} ; # my $utf8 = Encode::find_encoding('utf8') ; sub decode ($) ; sub encode ($) ; * decode = $o{b} ? sub ($) { $_[0] } : $o{w} ? sub ($) { Encode::JP::decode('cp932',$_[0]) } : * decode_utf8 ; #* encode = $o{b} ? sub ($) { $_[0] } : * encode_utf8 ; * encode = $o{w} ? sub($){Encode::JP::encode('cp932',$_[0])} : $o{b} ? sub ($) { $_[0] } : *encode_utf8 ; my $h = $o{b} ? '0x' : $o{w}? '0x' : 'u+' ; # 区点番å·ã‚’出力ã™ã‚‹æ™‚ã«è¡¨ç¤ºã™ã‚‹æŽ¥é 辞 my $base = $o{0} ? 0 : 1 ; # ゼãƒã‚ªãƒªã‚¸ãƒ³ã«ã™ã‚‹ã‹ã€1オリジンã«ã™ã‚‹ã‹ if ( $o{n} ) { & CountChars } elsif ( $o{1} ) { & OneLineOneChar } else { & LinePreserve } ; exit 0 ; # 1æ–‡å—を制御文å—ã«ã¤ã„ã¦ã¯ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—æ–‡å—を付ã‘ãŸæ§˜ãªå½¢ã«ã™ã‚‹ã€‚ã‚ã‚‹ç¨®ã®æ–‡å—ã®æ£è¦åŒ–ã™ã‚‹ã€‚ sub norChar($){ state $x = \{ 0,'\0',7,'\a',8,'\b',9,'\t',10,'\n',11,'\v',12,'\f',13,'\r',27,'\e'} ; return $$x->{ ord $_[0] } // $_[0] ; } sub LinePreserve { say CYAN UNDERLINE +( $o{':'} ? 'lin#:' : '' ) . '#char', DARK '(#bytes)' , RESET UNDERLINE "\tchar ", DARK "u+code .." ; while (<>) { my $str = decode ( $_ ) ; print CYAN +($o{':'}?($.+$base-1).":":''), length $str , DARK '(' , length $_ , ')' , RESET "\t" ; for ( split //, $str , 0 ) { my @out = ( BOLD sprintf ( '%s' , norChar $_ ) , RESET DARK sprintf ( " $h%02x " , ord $_ ) ) ; print @out ; } say '' ; } } # 出力ã™ã‚‹å„行ã¯ã€å…¥åŠ›ã®å„æ–‡å—ã«ç›¸å½“ã•ã›ã¦ã„ã‚‹ã€å‹•作 sub OneLineOneChar { my ($posC,$posL) = ($base) x2 ; #æ–‡å—ã®å…ˆé ã‹ã‚‰ã®ä½ç½®ã€ è¡Œç•ªå· * codify = $o{u} ? sub { sprintf 'u+%04x' , ord $_[0] } : sub { sprintf '0x%s', unpack 'H12', encode($_) } ; for( ; <> ; $posL ++ ){ my $posC0 = $posC ; for ( @_ = split //, decode($_), 0 ; defined($_=shift) ; $posC++ ) { #my @out = ( sprintf ( "$h%04x" , ord encode($_) ) , sprintf ('[%s]' , norChar $_ ) ) ; #my @out = ( sprintf ( "$h%s" , (unpack 'h12' , encode($_) ) ) , sprintf ('[%s]' , norChar $_ ) ) ; my @out = ( &codify ($_) , sprintf ('[%s]' , norChar $_ ) ) ; #unshift @out , sprintf ("$posC:$posL-$posCL(%s)", encode($_) ) if $o{':'} ; unshift @out , sprintf "%d:%d-%d" , $posC, $posL, $posC - $posC0 + $base if $o{':'} ; say join "\t" , @out ; } #$posL ++ ; } say STDERR CYAN ITALIC "Lines: " , $. , RESET '' ; } # 出ç¾ã—ãŸæ–‡å—ã®é›†è¨ˆè¡¨ sub CountChars { my %chars ; # 儿–‡å—ã®é »åº¦ã‚’æ ¼ç´ my %f0l ; # 儿–‡å—ã®æœ€åˆã®å‡ºç¾ã®è¡Œç•ªå· my %f1l ; # 儿–‡å—ã®æœ€å¾Œã®å‡ºç¾ã®è¡Œç•ªå· my $line = 0 ; # 全体ã®è¡Œæ•° while( <> ) { for ( split // , decode ( $_ ) , 0 ) { $chars{ $_ } ++ ; $f0l { $_ } //= $line ; $f1l { $_ } = $line ; } $line ++ ; } my @out = ( "freq", "code_point", "char" ) ; push @out , "linum_first" , "linum_last" if $o{':'} ; say UNDERLINE join "\t" , @out ; for( sort {$chars{$b} <=> $chars{$a} } keys %chars ) { my @out = ( $chars{ $_ } , sprintf( "U+%02X" ,ord $_) , sprintf ('[%s]' , norChar $_ ) ) ; push @out , $f0l{$_} + $base , $f1l{$_} + $base if $o{':'} ; say join "\t" , @out ; } say STDERR CYAN ITALIC "Lines: " , $line , RESET '' ; } sub VERSION_MESSAGE {} sub HELP_MESSAGE { $0 =~ s|.*/|| ; while(<DATA>){s/\$0/$0/g;print $_ if s/^=head1// .. s/^=cut// } exit 0 } no utf8 ; __END__ =encoding utf8 =head1 $0 (utf8ã¨ã¿ãªã—ã¦) 入力データをã²ã¨ã¤ã²ã¨ã¤ã®æ–‡å—ã«ã°ã‚‰ã—ã¦ã€ç¬¦å·ä½ç½®ã‚’表ã—足りã€é »åº¦ã‚’æ•°ãˆãŸã‚Šã™ã‚‹ã€‚ [オプション] -b : utf8ã§ã¯ãªãã¦ãƒã‚¤ãƒˆå˜ä½ã§å‡¦ç†ã™ã‚‹ã€‚ -u : 0x 表記ã§ã¯ãªã u+ ã§è¡¨ç¤ºã€‚ãƒã‚¤ãƒŠãƒªã§ç„¡ãã¦ã€ãƒ¦ãƒ‹ã‚³ãƒ¼ãƒ‰ã®åŒºç‚¹ç•ªå·ã¨ãªã‚‹ã€‚ -1 : 入力を1æ–‡å—ãšã¤å‡ºåŠ›1行ã«åæ˜ ã€‚ -: ; æ–‡å—ã®ä½ç½®ã‚’表示 -0 : ã„ã‚ã„ã‚ãªä½ç½®ã‚’表ã™ã®ã«ã€1å§‹ã¾ã‚Šã§ã¯ãªãã¦ã€0å§‹ã¾ã‚Šã«ã™ã‚‹ã€‚ -n : 儿–‡å—ã®é »åº¦ã‚’æ•°ãˆã‚‹ã€‚ [用途] * é »å‡ºã™ã‚‹æ–‡å—を知る。 * よãä¼¼ãŸ2行ãŒã©ã“ã«é•ã„ãŒã‚ã‚‹ã®ã‹è¦‹ã¤ã‘ãŸã„ã¨ãã«ã€sdiff ã§ä¸¦ã¹ã‚‹æ“作ã®å‰ã«ä½¿ã†ã€‚ [開発上ã®ãƒ¡ãƒ¢] * grep -o . ã¨åŒã˜ç¨‹åº¦ã®å‡¦ç†é€Ÿåº¦ãŒã‚ã‚‹ã ã‚ã†ã‹ã€‚ * é »åº¦ã®å¤šã„é †ã«è¡¨ç¤ºã•れã¦ã„ã‚‹ãŒã€è¡¨ç¤ºé †ã‚’é¸ã¹ã‚‹ã‚ˆã†ã«ã‚ªãƒ—ションを作りãŸã„。 * 最åˆã®å‡ºç¾é †ã§ã¾ãšã¯æ ¼ç´ã—ãŸã„ã‹ã‚‚。 * freq, code-point, [normalized-char] ç‰ã‚’å…ˆé ã«å‡ºåŠ›ã™ã¹ã—。 * 最åˆã®å‡ºç¾ä½å€¤, 最後ã®å‡ºç¾ä½å€¤ã‚‚出力ã—ãŸã„。 * éžå¸¸ã«é•·ã„行をèªã‚€ã¨ãã«ã€é€”ä¸ã§çµæžœã‚’表示ã™ã‚‹ã‚ˆã†ã«ã—ãŸã„。 * ã“ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã®åå‰ã®å€™è£œã¨ã—ã¦ã¯ordcharsã¨ã‹ ordutf8ã¨ã‹ utf8ord を考ãˆãŸãŒã€2019-10-16ã«chars2code ã¨ã—ãŸã€‚ * utf8 以外ã«ã‚‚対応ã—ãŸã„。 =cut