sysvbannerをperlで書く続きです。
まず、前作ったのは捨てます。ソフトの基本ですね。
そして単純コピー。banner.cをコピーし、perlbannerという名前のファイルにします。
takk@deb83:~$ cp ./sysvbanner-1.0.15/banner.c perlbanner takk@deb83:~$
banner.cのC言語の部分はそのまま残して、ファイルの頭からperlスクリプトを埋め込むため、ブロックコメント(comment〜cut)を使います。
(ここにperlスクリプトを入れる予定) =comment /***************************************************************** * * SYSVbanner.c * * This is a PD version of the SYS V banner program (at least I think * it is compatible to SYS V) which I wrote to use with the clock * program written by: ** DCF, Inc. ** 14623 North 49th Place ** Scottsdale, AZ 85254 * and published in the net comp.sources.misc newsgroup in early July * since the BSD banner program works quite differently. * * There is no copyright or responsibility accepted for the use * of this software. * * Brian Wallis, brw@jim.odr.oz, 4 July 1988 * *****************************************************************/ /* Changes by David Frey, david@eos.lugs.ch, 3 February 1997: * 1. protoized and indented, 2. changed @ character to # */ (省略) =cut
このglyphsの文字列をperlで使いたいので、perlスクリプトが自身を読み込んで、glyphsを解析するようなプログラムにします。
char *glyphs[] = { " ### ### ### # # ##### ### # ## ### ", " ### ### ### # # # # ## # # # # ### ", " ### # # ######## # ### # ## # ", (省略)
こうなりました。
takk@deb83:~$ cat -n perlbanner 1 #!/usr/bin/perl 2 open(IN,"<$0"); 3 while(<IN>){ 4 if(/^ "(.*)"/){ 5 $_=$1; 6 s/([ #]{7})/push @glyphs,$1/ge; 7 } 8 } 9 close(IN);
4,5行目で、””の中身を引っこ抜いています。6行目で文字列セットを配列に格納。
コマンド引数の解析部は、このようになりました。intとか要らないところはありますが、綺麗だから合わせて書いてます。
11 foreach $str (@ARGV){ 12 foreach $row (0..6){ 13 foreach $ch (split //,$str){ 14 $n = (ord $ch) - (ord " "); 15 $y = int($n / 8); 16 $x = int($n % 8); 17 print $glyphs[$y*56 + $x + $row*8] ." "; 18 } 19 print"\n"; 20 } 21 print"\n"; 22 }
実行してみましょう。
takk@deb83:~$ ./perlbanner HELLO ABC # # ####### # # ####### # # # # # # # # # # # # # # ####### ##### # # # # # # # # # # # # # # # # # # # # ####### ####### ####### ####### # ###### ##### # # # # # # # # # # # # # ###### # ####### # # # # # # # # # # # ###### ##### takk@deb83:~$
perlらしくというか、banner.cごと取り込んでしまいました。
コメント