作者: dune
日時: 2004/9/06(02:47)
極悪です。

[TSperl:470] Re: Perlクックブック第二版 に書いた
ごみスクリプトをもっと汎用的に使えるようにしました。
遊びで、ちょっとわかりにくく書いてます。

use strict;
use encoding "sjis";

my %seen;
my $bit = 2**$#ARGV;

sub see{
    my $file = shift or die;
    my $func = shift || sub{};
    open(FILE,"<:encoding(sjis)",$file) or die;
    local $_;
    while(<FILE>){
        chomp;
        $func->($_);
        $seen{$_} |= $bit;
    }
    close FILE;
    $bit >>= 1;
}

foreach(@ARGV){
    see($_,sub{ s/[\t\s]+/ /g });
}

my @prefix;
foreach(0..2**@ARGV){
    $prefix[$_] = sprintf("%0@{[@ARGV+0]}b",$_);
    my $i = 0;
    $prefix[$_] =~ s/./("_",++$i)[$&]/ge;
}

my %count;
foreach(sort keys %seen){
    print "$prefix[$seen{$_}]: $_\n";
}



使い方は perl hoge.pl file1 file2 file3 file4 ...
ってな具合で、file1〜file4 全てに現れる行は 1234、
file1 だけに現れる行は 1___ などと表示します。
使い道がないのが難。これの diff 版があるといいんだけど
(どこかにありそう?)。

D:% perl hoge.pl C:Perl400\lib\strict.pm C:Perl500\lib\strict.pm C:Perl600\lib\strict.pm C:Perl800\lib\strict.pm |grep -v "1234:" |head -20
123_:  $SIG{PIPE} = "Plumber"; # just fine: bareword in curlies always ok
___4:  $SIG{PIPE} = "Plumber"; # just fine: quoted string is always ok
___4:  $^H &= ~ (@_ ? bits(@_) : $default_bits);
123_:  $^H &= ~ bits(@_ ? @_ : qw(refs subs vars));
___4:  $^H |= @_ ? bits(@_) : $default_bits;
123_:  $^H |= bits(@_ ? @_ : qw(refs subs vars));
__34:  $bar = \&{'foo'};
___4:  $bits |= $bitmask{$s} || 0;
__34:  $file = "STDOUT";
__34:  &$bar;
___4:  Carp::croak("Unknown 'strict' tag(s) '@wrong'");
___4:  Unknown 'strict' tag(s) '...'
___4:  foreach my $s (@_) {
123_:  foreach my $s (@_){ $bits |= $bitmask{$s} || 0; };
___4:  if (@wrong) {
___4:  my @wrong;
__34:  our $bar; # Declares $bar in current package
__34:  print $file "Hi!"; # error; note: no comma after $file
___4:  push @wrong, $s unless exists $bitmask{$s};
___4:  require Carp;

D:%
-- 
極悪, FZH01112 at nifty.com
http://hpcgi1.nifty.com/dune/gwiki.pl?