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


コメント