本文の内容より、こちらが妙に懐かしかったので。

[を] UTF-8 で半角カナを判定
begin 755 utf8hankana-test.pl.gz

二十代だとぴんとこないだろうなあ、uuencode。Wikipediaもenの方にはあってもjaの方にはないもんなあ。

かつては、これがbinary fileをテキストで表現する de facto standardでした。しかしWikipediaのEntryにあるように、今はBase64にほとんど置き換えられています。

decodeにはuudecodeというコマンドを使います。たいていのUnix-LikeなOSには/usr/binに入っていると思いますが、そうでない場合でも、perlがあれば対応できます。

実はperlのpack()にはその面影が残っていて、uがuuencodeのformatに対応しています。これのおかげで、簡単なdecoderであれば一行で書けます。

perl -e 'print unpack("u",$_) while(<>)' encoded > decoded

ただし、この場合はbegin 644 filenameからendまでの行をぬいておかなければいけません。もう少しきちんと書くと、以下のとおりとなるでしょう。

uudecode.pl
#!/usr/local/bin/perl
use strict;
use warnings;
my ($begin, $perm, $filename, $wfh);
while(<>){
    if (/^begin\s+([0-7][0-7][0-7])\s+(\S+)/o){
        ($begin, $perm, $filename) = (1, oct($1), $2);
        open $wfh, '>', $filename or die "$filename : $!";
    }elsif(/^end$/o){
        $begin = 0;
        close $wfh;
        chmod $perm, $filename;
    }
    next unless $begin;
    print $wfh unpack("u", $_);
}
__END__
uuencode.pl
#!/usr/local/bin/perl
use strict;
use warnings;
for my $filename (@ARGV){
    open my $rfh, '<', $filename or  die "$filename : $!";
    my $content  = eval{ local $/; <$rfh> };
    close $rfh;
    my $perm = (stat($filename))[2] & 0777;
    printf "begin %o $filename\n", $perm;
    print pack("u", $_) while($_ = substr($content, 0, 45, ''));
    print "`\nend\n";
}
__END__

ちなみに、このuフォーマットは、Base64にも使えます。

while(<>){
  tr#A-Za-z0-9+/##cd;
  tr#A-Za-z0-9+/# - _#cd;
  $len = pack("c", 32 + 0.75*length($_));
  print unpack(u", $len . $_);
}

この例、ラクダ本のunpackの説明には出てくるのですが、perldoc -f unpackでは出てきませんねえ。

まあこんなところかな。

他にもsharなんてのもあったなあ....

Dan the uu(en|de)coder