本文の内容より、こちらが妙に懐かしかったので。
[を] 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の出番は少なくなっているかもしれませんが。