sysvbannerをperlで書く(その1)

C言語で書かれているbannerコマンドをperlソースで作ってみます。

ソース取得。

takk@deb83:~$ apt-get source sysvbanner
takk@deb83:~$ cd sysvbanner-1.0.15

単純コピー。

takk@deb83:~/sysvbanner-1.0.15$ cp banner.c banner.pl
takk@deb83:~/sysvbanner-1.0.15$ 

変数は$をつけます。

takk@deb83:~/sysvbanner-1.0.15$ perl -pe 's/\b(a|b|c|len|ind|line)\b/\$$1/g' -i banner.pl

bannerのフォントを作っている文字列ポインタchar *glyphs[]をperlのアレイにします。
{}も()に修正します。

@glyphs =
(
  "         ###  ### ###  # #   ##### ###   #  ##     ###  ",
  "         ###  ### ###  # #  #  #  ## #  #  #  #    ###   ",

(省略)

  "  #  #     #    #     #        #        #         # # # ",
  " #    #    #   ######  ###     #     ###         # # # #");

mainは不要なので削除します。型は、myにしてもしておきましょうか。
$をつけてしまった変数でも配列なら@に直します。

  my $a, $b, $c, $len, $ind;
  my @line=();

引数の for (argv++; –argc; argv++) 処理は、foreachで書き直します。
*argvポインタは使えないので、$argvとでもしておきます。
strlenは、lengthにします。if文は{}をつけるように修正します。

  foreach $argv (@ARGV) {
    $len = length($argv);
    if ($len > 10){
      $len = 10;}

文字列から1文字を取得する処理は、C言語のようにはいかないので、substrに抽出します。
文字コードもordで取得。あと、割り算で勝手にintにしてくれるC言語とは違ってint関数を使わないと、インデックスがおかしくなります。

    for ($a = 0; $a < 7; $a++) {
      for ($b = 0; $b < $len; $b++) {
        if (($ind = (ord substr($argv,$b,1)) - (ord ' ')) < 0){
          $ind = 0;}
        for ($c = 0; $c < 7; $c++) {
          $line[$b * 8 + $c] = substr($glyphs[int ($ind / 8) * 7 + $a],int($ind % 8) * 7 + $c, 1);
        }
        $line[$b * 8 + 7] = ' ';
      }
      for ($b = $len * 8 - 1; $b >= 0; $b--) {
        if ($line[$b] != ' '){
          break;}
      }
print @line;
print "\n";
    }
  }

無理やりprintすればできあがりです。

使ってみます。

takk@deb83:~/sysvbanner-1.0.15$ perl banner.pl HELLO
#     # ####### #       #       ####### 
#     # #       #       #       #     # 
#     # #       #       #       #     # 
####### #####   #       #       #     # 
#     # #       #       #       #     # 
#     # #       #       #       #     # 
#     # ####### ####### ####### ####### 
takk@deb83:~/sysvbanner-1.0.15$ 

C言語チックなので、次回はperlらしく書き換えてみます。

One response to “sysvbannerをperlで書く(その1)

  1. Phonmeenal breakdown of the topic, you should write for me too!

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA