#!/usr/bin/perl use 5.014 ; use strict ; use warnings ; use Getopt::Std ; getopts 'k:lsuv0=' , \my%o ; use Scalar::Util qw/looks_like_number/ ; my ( @mins, @maxs , @tmp , $linecount ) ; my $lineproc ; &initProc ; &mainProc ; exit 0 ; sub mainProc { while ( 1 ) { last if eof () ; &chunkProc ; } } sub chunkProc { $linecount = 0 ; @mins = () ; @maxs = () ; my $header = <> if $o{'='} ; while ( <> ) { chomp ; #next unless looks_like_number( $_ ) ; $linecount ++ ; $lineproc -> () ; last if eof || m/^$/ ; } ( $mins[0], $maxs[0] ) = &minmax( @tmp ) if $o{0} ; &malign if $o{k} ; &resultOut ; } sub malign { push @maxs , @tmp ; push @mins , @tmp ; if ( $o{u} ) { @maxs = &uniq( @maxs ) ; @mins = &uniq ( @mins ) } ; @maxs = $o{s} ? sort {$b cmp $a} @maxs : sort {$b<=>$a} @maxs ; @mins = $o{s} ? sort {$a cmp $b} @mins : sort {$a<=>$b} @mins ; splice @maxs , $o{k} ; splice @mins , $o{k} ; @tmp = () ; } sub resultOut { if ( $o{l} ) { for ( @mins , @maxs ) { print $_ , "\n" } print $linecount , "\n" if $o{v} ; } elsif ( $o{v} ) { print join( ", " , @mins) , " - " , join( ", " , reverse @maxs) , " (", $linecount, " lines)\n" ; } else { print join "\t" , @mins , '-' , reverse @maxs ; print "\n" ; } } sub initProc { $o{k} = 3 unless grep { m/^[0k]$/ } keys %o ; $lineproc = defined $o{k} ? sub { push @tmp , $_ ; &malign if @tmp > $o{k} * 2 + 25 ; } : defined $o{0} ? sub { push @tmp , $_ } : sub { 1 } ; } sub uniq (@) { my %seen = (); grep { not $seen{$_}++ } @_; } sub minmax (@) { return unless @_; my $min = my $max = $_[0]; for ( my $i = 1; $i < @_; $i += 2 ) { if ( $_[$i-1] <= $_[$i] ) { $min = $_[$i-1] if $min > $_[$i-1]; $max = $_[$i] if $max < $_[$i]; } else { $min = $_[$i] if $min > $_[$i]; $max = $_[$i-1] if $max < $_[$i-1]; } } if ( @_ & 1 ) { my $i = $#_; if ($_[$i-1] <= $_[$i]) { $min = $_[$i-1] if $min > $_[$i-1]; $max = $_[$i] if $max < $_[$i]; } else { $min = $_[$i] if $min > $_[$i]; $max = $_[$i-1] if $max < $_[$i-1]; } } return ($min, $max); } sub VERSION_MESSAGE {} sub HELP_MESSAGE{ $0=~s|.*/|| ; $ARGV[1] //= '' ; while(<DATA>){ s/\$0/$0/g ; print $_ if $ARGV[1] =~ /opt/ ? m/^\ +\-/ : s/^=head1// .. s/^=cut// ; } exit 0 ; } __END__ =encoding utf8 =head1 $0 入力ã•ã‚ŒãŸæ•°å€¤ã®ä¸‹ä½3個ã¨ä¸Šä½3個を出力ã™ã‚‹ã€‚ ç•°ãªã‚‹ãƒ•ァイルã«ã‚ˆã‚‹å…¥åŠ›ã€ãŠã‚ˆã³ã€ç©ºè¡ŒåŒºåˆ‡ã‚Šã¯ã€åˆ¥ã®ãƒ‡ãƒ¼ã‚¿ã‚»ãƒƒãƒˆã¨è¦‹ãªã•れる。 最å°ã¨æœ€å¤§ã®ãれãžã‚ŒæŒ‡å®šå€‹æ•°ã‚’ -k ã§å¤‰æ›´ã™ã‚‹ã“ã¨ã‚‚出æ¥ã‚‹ã€‚ オプション: -k num : 最å°å€¤ã¨æœ€å¤§å€¤ã®ä¸Šã‹ã‚‰ãれãžã‚Œä½•個を表示ã™ã‚‹ã‹ã€‚3å€ãã‚‰ã„æ™‚é–“ãŒã‹ã‹ã‚‹ã€‚ -s : æ–‡å—列ã¨ã—ã¦å¤§å°é–¢ä¿‚を比較ã™ã‚‹ã€‚ -u : åŒã˜å€¤ã¯ä¸€ã¤ã«ã¾ã¨ã‚る。 -l : 出力ã®åŒºåˆ‡ã‚Šã‚’改行文å—ã«ã™ã‚‹ã€‚ -v : 人ã®ç›®ã§èªã¿ã‚„ã™ã„表示形å¼ã«ã™ã‚‹ã€‚処ç†è¡Œæ•°ã‚‚出力ã™ã‚‹ã€‚ -= : 最åˆã®è¡Œã¯èªã¿é£›ã°ã™ã€‚ 開発上ã®ãƒ¡ãƒ¢: 高速化をã—ãŸã„。(sort , æƒ…å ±ç§‘å¦ä¸Šã®ãƒ„ãƒªãƒ¼ã®æ´»ç”¨ãªã©) æ•°ã®æœ€å°ã¨æœ€å¤§ã§ã¯ç„¡ãã¦ã€æ–‡å—åˆ—ã®æœ€å°ã¨æœ€å¤§ã‚‚表示ã§ãるよã†ã«ã—ãŸã„。 #-k ã 㨠-3ã‚„-2 ã®ã€2å€ç¨‹åº¦æ™‚é–“ãŒã‹ã‹ã‚‹ã€‚ ä»–ã€-b ã§ãƒãƒ–ルソートをã—ãŸãŒã€-kã¨åŒã˜ç¨‹åº¦ã«æ™‚é–“ãŒã‹ã‹ã‚Šã€ã•らã«ç®—出ã™ã‚‹å€‹æ•°ã‚’増やã™ã¨ ãã‚Œã«æ¯”例ã—ã¦é…ããªã‚‹ã€‚ =cut