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らしく書き換えてみます。
コメント