2009/03/24

m4で作るシーザー暗号 on Ubuntu 8.10

なんとなくm4のドキュメントを復習していて、思いついた事。
m4マクロでシーザー暗号を作ってみた。

$ cat caesar.macro 
define(`TEXT', `This is a sample text.')
translit(TEXT, `a-z', `n-za-m')
$ m4 caesar.macro 

Tvwg wg o goadzs hslh.
で、これでうまくいったかというとそうでもないらしい。

確認のためにabc..xyzまでを変換してみる。

$ cat caesar.macro 
define(`TEXT2',`abcdefghijklmnopqrstuvwxyz.')
translit(TEXT2, 'a-z', `n-za-m')
$ m4 caesar.macro 

opqrstuvwxyzabcdefghijklm.
どうやら一文字'n'が足りない。消えてしまっているようだ。

info m4で確認すると対応する文字が少ない場合には文字が消えるとあるけれど、何でかなぁ。
まぁ長い分には単純に無視されるとあるが、やっぱりおかしいのでいろいろチェック。

回答編

ああ、わかった。quoteでちゃんと囲めていなかったんだ。バッククォート"`"とクォート"'"でちゃんと囲む。

$ cat caesar_v2.macro 
define(`TEXT2',`abcdefghijklmnopqrstuvwxyz.')
translit(TEXT2,`a-z', `n-za-m')
$ m4 caesar_v2.macro 

nopqrstuvwxyzabcdefghijklm.
なんとか、うまくいったらしい。よしよし。
わかってたのに、なんで打ち間違ってしまったんだろう。 ま、こんな日もあるってことなのかな。

0 件のコメント: