sysvbannerをperlで書く(その2)

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ごと取り込んでしまいました。

コメント

タイトルとURLをコピーしました