Bin-Data-1D

 view release on metacpan or  search on metacpan

scripts/wc-l  view on Meta::CPAN

#!/usr/bin/perl
use 5.001 ; use strict ; use warnings ; # 5.014 で動作確認済み
use autodie qw[ open ] ; 
use Getopt::Std ; getopts 'bd:gsnrz=~!3":' , \my%o ;
use Term::ANSIColor qw/:constants color / ; $Term::ANSIColor::AUTORESET = 1 ;
use Scalar::Util qw[ dualvar ] ; # <-- dualvar の利用は、あまり好ましくない可能性はある。試しに使ってみた。
use FindBin qw [ $Script ] ; 

use Encode qw[ decode ] ; 
use Encode::JP ; 

eval "use PerlIO::gzip;1" or die "Can't import PerlIO::gzip despite -z instruction. ($Script)\n" if $o{z} ; 

sub main ( ) ; # 入力を順次処理する
sub eachFile ( $ ) ; # 引数で指定された各ファイルを処理して、行数を返す。
sub lineNum ( $ ) ; # (各ファイルから与えられる) ファイルハンドルから、行数を返す。
sub sigint ( ) ; # Ctrl-C が押下された時の処理
sub hhmmss ( ) ; # 現在時刻を yyyy-mm-dd HH:MM:SS の形で返す。
sub cyc_rep ( ) ;

$/ = "\r\n" if $o{r} ;
#$/ = "" ;
$| = 1 if $o{'!'} ; 
* CYAN = * BRIGHT_CYAN = * BLUE = * BRIGHT_BLUE = sub { @_ } if $o{b} ; # <-- TRICKY A LITTLE.

my ($time0, $time00) = (time) x 2 ; 
my $cyc_sec = $o{'"'} // 10 ; # 何行毎にレポートを発生させるか。
my $cyc_last_line  ; # 

my $noLineEnd = 0 ; # 行末の文字が改行(正確には $/ ) に一致しなかったファイルの個数
my $dirnum = 0 ; # ディレクトリの個数
my $fn ; # 読んでいるファイルの名前
my $FH ; # ファイルハンドル

main ;
exit 0 ;

sub main ( ) { 
  my $time00 = time ; 
  my $total_lines = 0  ; # 全ファイルの行数の合計
  @ARGV = ( '-' ) unless @ARGV ; 

  $SIG{INT} = \& sigint ; ## \sigint
  $total_lines += eachFile $_ for @ARGV ; 
  * BLUE = * BRIGHT_BLUE ; # <-- - TRICKY ! 
  #my $fn ; # 合計の項目であることを表す文字列
  $fn = (scalar @ARGV - $dirnum). " files" ; 
  $fn .= " plus $dirnum directories" if $dirnum > 0 ;
  $fn = "[- $fn -]" ;
  out1line ( dualvar ($total_lines , -"$noLineEnd" )  , $fn , $time00 ) if @ARGV >= 2 ; # 1個しか入力が無い場合は出さない。
}    

# 各ファイルに対し、dualvarで行数とEOF状態を返す。ファイル名から行数を返す関数を起動し、それを出力する関数を起動する。
sub eachFile ( $ ) { 
  my $time0 = time ; 
  $fn = $_[0] ;

  # ファイルハンドラを設定。"-" なら標準入力。 
  if ( $_[0] ne "-" )  {
    if ( ! $o{g} ) { 
        open $FH , '<' , $_[0] 
      } else { 
        open $FH , '-|' , 'gzcat' , $_[0] ; 
        #open $FH [ $_ ] , '-|' , 'gzcat' , $ARGV[$_] ; # open $FH, "gzcat '$ARGV[$_]' |" より良いと思った
      }
  } else { 
    $FH = * STDIN 
  } ; 

  binmode $FH , ":gzip(gzip)" if $o{z} ; 

  my $header = <$FH> if $o{'='} ; # <-- 一応意味はある。-+ スイッチオプションで対応できないか? 
  my $ret = lineNum $FH ; 
  out1line ( $ret , $fn , $time0 ) ; 
  return $ret  ; 
}

#  ファイルハンドラから行数を返す。
sub lineNum ( $ )  {
  my $last_count = $. ; 
  my $FH = $_[0] ;
  my $count = 0 ;

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 1.386 second using v1.00-cache-2.02-grep-82fe00e-cpan-d29e8ade9f55 )