本文の内容より、こちらが妙に懐かしかったので。
[を] 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までの行をぬいておかなければいけません。もう少しきちんと書くと、以下のとおりとなるでしょう。
#!/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
参照: http://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/porting-submitting.html
もっとも、何か他のアプリケーション用portsを参照して作ったようなケースでは、「cvsのレポジトリをコピーする依頼と、そのコピーに対するpatch
」を送る様に言われたりするようで、sharの出番は少なくなっているかもしれませんが。