#!/usr/bin/perl use 5.014 ; use strict; use warnings; use Time::HiRes qw [ gettimeofday tv_interval ] ; my ${ dt_start } = [ gettimeofday ] ; use Scalar::Util qw/looks_like_number/; use Getopt::Std; getopts "=~1:c:f:ghqu", \my%o; use Term::ANSIColor qw[ :constants ] ; use feature qw[ say ] ; sub readInput () ; # 入力ã®èªå–り sub printOutput () ; # å‡ºåŠ›ã®æ›¸ã出㗠eval { use bigint qw[ hex ]} if $o{h} ; $| = 1 unless $o{u} ; my $sum = 0 ; # 求ã‚ãŸã„åˆè¨ˆå€¤ my $lln = 0 ; # åŠ ç®—å¯¾è±¡ã¨ãªã£ãŸè¡Œã®æ•° my $nlln = 0 ; # éžåŠ ç®—å¯¾è±¡ã®è¡Œã®æ•° my $header = undef ; # -= ãŒæŒ‡å®šã•れãŸå ´åˆã«ãƒ˜ãƒƒãƒ€è¡Œã‚’æ ¼ç´ã€‚ my $fp = $o{f} >=0 ? $o{f} - 1 : $o{f} if defined $o{f} ; # ã©ã®åˆ—を抽出ã™ã‚‹ã‹ my $fps = $fp >=0 ? $fp + 1 : 0 if defined $o{f} ; # splitã§ä½¿ã†ã€‚ my ${ ctrl_c } = sub { $Term::ANSIColor::AUTORESET = 0 ; my $lt = sprintf '%04d-%02d-%02d %02d:%02d:%02d' , do {my @t = @{[localtime]}[5,4,3,2,1,0] ; $t[0]+=1900 ; $t[1]++ ; @t } ; my $ln = $. ; $ln =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/g ; # 3æ¡æ¯Žã«ã‚³ãƒ³ãƒžã§åŒºåˆ‡ã‚‹ say ITALIC DARK BOLD sprintf " The current result ($lt): %s lines have been processed." , $ln ; printOutput ; say YELLOW 'Push Ctrl+\ or Ctrl+Z to stop the calculation.' ; print RESET '' ; } ; readInput ; printOutput ; exit 0 ; sub readInput () { chomp ( $header = <> ) if $o{'='} ; # ヘッダ行 $SIG{ INT } = $ { ctrl_c } ; # 型グãƒãƒ–/シンボルテーブルを使ã£ã¦ã¿ãŸã€‚ #my $org ; # 入力ã®å…ƒã®æ–‡å—列 * orgStore = defined $o{1} && $o{1} ? sub { @_ = ($_) } : sub { @_ = () } ; * colChoose = defined $fp ? sub { $_ = [ split ] -> [ $fp ] } : sub { } ; * caseHex = defined $o{h} ? sub { $_ = hex $_ } : sub {} ; * outOfCount = defined $o{c} && $o{c} == 0 ? sub { } : sub { do { $nlln ++ ; goto LOOP } if ! & get_num } ; * theSumming = $o{h} ? sub { $sum += $_ } : sub { $sum = "$sum" + "$_" } ; * get_num = $o{g} ? sub { m/[-\.\d]+/ ; $_ = $& ; looks_like_number $_ } : sub { looks_like_number $_ } ; * progress = defined $o{1} && $o{1} eq '0' ? sub { () } : ! $o{'~'} ? sub{ s/(^|[^0123456789.eEfF+-])(\d+)/$1+$2/g ; "$sum"."\t<= $_" } : # eEfFãªã©ã¨ã‚る部分ã¯ã“れã§è‰¯ã„ã®ã‹? sub { s/(^|[^+-0123456789.eEfF+-])(\d+)/$1+$2/g ; "$_\t"."=> $sum" } ; * doPrint = defined $o{1} && $o{1} eq '0' ? sub { } : sub { say join "\t" , @_ } ; LOOP : while( <> ) { chomp ; & orgStore ; & colChoose ; & caseHex ; & outOfCount ; # LOOPã«ã‚¸ãƒ£ãƒ³ãƒ—ã™ã‚‹ã“ã¨ãŒã‚る。 & theSumming ; # <-- ã“ã“ã§è¶³ã—ç®—ã®è¨ˆç®—ã‚’ã™ã‚‹ #$sum = "$sum" + "$_" ; #$sum = "$sum + $_ ; $lln ++ ; unshift @_ , & progress ; # @_ = & progress ; & doPrint ; } } sub printOutput () { #my $FH = $o{1} ? \* STDOUT : \*STDERR ; # <-- æ„味ãŒã‚ã£ãŸã®ã‹??? select $o{1} ? \* STDOUT : \*STDERR ; # <-- æ„味ãŒã‚ã£ãŸã®ã‹??? print $o{q}? '' : 'header=' , qq{'$header'\t} if $o{'='} ; my $fmt = $o{q} ? "%s\t%d\t%g\t%s" : "%s <- sum ;\t%d + %d <- counted + not ; \t%s <- average ;" ; #$fmt = "%50X <- sum ;\t%d + %d <- counted + not ;" if $o{h} ; my $quot = $lln != 0 ? $sum/$lln : "NaN" ; if ( "$quot" > $quot ) { $quot = "$quot" . '..(-)' } elsif ( "$quot" < $quot ) { $quot = "$quot" . '..(+)' } #if ( $o{h} ) { say sprintf( & hex8 ( $sum) ; return } ; $sum = & hex8 ( $sum ) if $o{h} ; say sprintf ($fmt , $sum, $lln, $nlln , "$quot") , sprintf "\t%0.6f sec calculation (summing)." , tv_interval ${ dt_start } ; } sub hex8 { my @out = '' ; my $n = $_ [0] ; $n = 0 if $n eq "NaN" ; my $c = 12 ; do {my $t = $n % 16**8 ; $n = int $n /16**8 ; unshift @out , sprintf "%08x" , $t ; say $n } while ($n != 0 && $c--) ; my $out = join " " , @out ; $out =~ s/^00+/0x 0/; return $out ; } sub VERSION_MESSAGE {} sub HELP_MESSAGE{ use FindBin qw[ $Script ] ; $ARGV[1] //= '' ; open my $FH , '<' , $0 ; while(<$FH>){ s/\$0/$Script/g ; print $_ if $ARGV[1] eq 'opt' ? m/^\ +\-/ : s/^=head1// .. s/^=cut// ; } close $FH ; exit 0 ; } =encoding utf8 =head1 $0 入力ã®å€¤ã‚’1行ãšã¤ã«å˜ç´”ã«è¶³ã—åˆã‚ã›ã‚‹ã€‚è£œåŠ©æƒ…å ±ã¨ã—ã¦ã€ä½•è¡ŒãŒæ•°ã¨ã—ã¦æ‰±ã‚れãŸã‹ã€å¹³å‡å€¤ãªã©å‡ºåŠ›ã™ã‚‹ã€‚ 10進数ã§åŠ ç®—ã‚’è¡Œã†ã€‚ æ•°ã‹ã©ã†ã‹ã®åˆ¤å®šã¯ Scalar::Util ã® looks_like_number 関数を使ã£ã¦ã„る。値ã¯å˜ç´”ã«è¶³ã—ã¦ã„る。atof ãªã©ä½¿ã£ã¦ã„ãªã„。 出力: 1. åˆè¨ˆå€¤ 2. åˆè¨ˆã«ä½¿ã‚ã‚ŒãŸæ•°ã®å€‹æ•° 3. åˆè¨ˆã«ä½¿ã‚れãªã‹ã£ãŸè¡Œã®æ•° 4. å¹³å‡å€¤ 5. 計算ã«ä½¿ã£ãŸç§’æ•°(å°æ•°ç‚¹ä»¥ä¸‹6æ¡) オプション: -= : 最åˆã®è¡Œã‚’ヘッダã¨è¦‹ãªã—ã€ãれãŒä½•ã§ã‚ã£ãŸã‹ã‚’最後ã«å‡ºåŠ›ã™ã‚‹ã€‚ -1 0 : 累計ã®é€”ä¸ã®çµæžœã‚’表示ã—ãªã„。 -1 1 : 途ä¸ã®çµæžœã«åŠ ãˆã¦ã€å…ƒã®å…¥åŠ›æ–‡å—列をå³å´ã«é€£çµã—ã¦å‡ºåŠ›ã€‚ -c 0 : 数値ã§ã‚ã‚‹ã‹ã©ã†ã‹ã®ãƒã‚§ãƒƒã‚¯ã‚’ã—ãªã„。高速化ã®ãŸã‚。 -f N : AWKå½¢å¼ã§å…¥åŠ›ã®å„行を分割㗠N番目ã®åˆ—ã®å€¤ã‚’å–り出ã™ã€‚ -g : æ•°ã§ç„¡ãã¨ã‚‚ã€ã§ãã‚‹ã ã‘æ•°ã®éƒ¨åˆ†ã‚’å–り出ã—ã¦è¨ˆç®—ã™ã‚‹ã€‚ -h : 入力ã™ã‚‹æ•°ã¯16進数ã¨ã—ã¦å¯¾å¿œã€‚ md5sum ã§ãƒ‡ã‚£ãƒªã‚¯ãƒˆãƒªã®ä¸ã®ãƒ•ァイル群ã®ä¸€è‡´ã‚’見るã¨ã便利。 -q : å†—é•·ãªæ–‡å—列(sum=.. , ave=.. ãªã©) を表示ã—ãªã„。 -~ : 累計ã¨å€¤ã®å‡ºåŠ›é †åºã‚’å転ã™ã‚‹ã€‚ -u : 出力ã®ãƒãƒƒãƒ•ァリングをã—ãªã„。 -f N : AWKå½¢å¼ã§åˆ—ã«ãƒãƒ©ãƒãƒ©ã«ã—ã¦ã€1å§‹ã¾ã‚Šã§å·¦ã‹ã‚‰N番目をå–り出ã™ã€‚è² ã®æ•°ã¯-1ã ã¨æœ€ã‚‚å³ã®åˆ—。 開発上ã®ãƒ¡ãƒ¢: * [split " " , $_ , $fps] ãŒã†ã¾ã ã„ã‹ãªã‹ã£ãŸã®ã§ [split] ã¨ã—ãŸãŒã€è‰¯ã‹ã£ãŸã®ã‹? -- * bin4tsv/summing å…ˆé ã®æ•°å—ã®ç´¯è¨ˆå’Œã‚’å–り出ã™ã‚ˆã†ã«ã—ãªãŒã‚‰ã€å„列全文å—列ã®è¡¨ç¤ºã‚’行番å·ã¨å…±ã«ã™ã‚‹ã‚ˆã†ã«ã›ã‚ˆã€‚ * è¶³ã™å ´æ‰€ã®ãƒ•ィールド番å·ã‚‚AWKå½¢å¼ã§(AWKã®ç©ºç™½åŒºåˆ‡ã‚Šã§)指定ã§ãるよã†ã«ã›ã‚ˆã€‚ * -Fã§åŒºåˆ‡ã‚Šæ–‡å—を指定ã§ãるよã†ã«ã›ã‚ˆã€‚ =cut