みなさん、こんにちは。
5月に始めたこの講座も6回目になりました。夏を越え、冷たい風が吹いていますが、皆さま、風邪などひかないようにしてください。
さて、今日は前回の補足から始めたいと思います。前回さらっと紹介した #informat
について、もう少し説明しましょう。TELNET クライアントの漢字コード設定を Shift_JIS にしてコマンド入力してください。
まずは単純に #informat
を直接入力してみましょう。
多くの環境では
と出力されたはずです。前回紹介した expanded to:
がまた出ましたが、これは built-in function
ではなく、built-in variable
です。組み込み変数ということですね。built-in variable
は TACL が native
で持つ環境変数群です。#informat
は TACL の会話モードで入力した文字列をどう解釈するかを指定する built-in variable
で、値としては PLAIN
, QUOTED
, TACL
のいずれかをとります。
[ ]
も特殊文字です。他に { } == |
といったものがあります。“”
で囲われた部分では特殊文字の処理を行ないません。通常は特殊文字の処理をしてほしいので、#informat
は TACL になっている環境がほとんどです。#informat
と入力して TACL と出力された環境では特になにもする必要はありません。それ以外の環境は、管理者と相談してみた方がいいかもしれません。とりあえずの方策としては、前回のように
と1回入力しておけば、logoff
するまで設定が有効です。
入力があれば出力もある、というわけで #outformat built-in variable
というものがあります。とり得る値は PLAIN
, PRETTY
, TACL
の3つです。ですが、これをしっかり理解するにはもう一度 #informat
の話に戻らないといけません。まず、次のコマンドを入力してみましょう。
するとこうなるはずです。
ここでは2つの問題が出ています。1つは文字化け。1つはエラー。文字化けについてはリモートエコーによるビット落ちのためなので気にしないでください。(TELNET クライアントによっては文字化けしないこともあります)
で、問題はエラーです。5分差し上げますので、何が悪いか推理してみてください。ヒントは文字化けの中にあります。
<チッ、チッ、チッ、チッ、5分経過>
さあ、時間切れです。解答にたどり着きましたか?
文字化けの定番に5C問題というのがあります。¥
という文字を半角で表示すると文字コードは5Cになります。英語圏ではこのコードは backslash
に割り当てられていて、文字列の escape
として使われているため、文字コードに5Cを含む漢字が化けてしまう問題のことです。例えば「表」という文字がその例です。
で、上記の #set
コマンドに「表」が含まれているではないか!!
と、思った方はうっかりさん!
TACL では backslash
を escape code
として使うことはありません。従って「表」という漢字はまったく問題なく使用できます。では TACL の特殊文字は何か?
といえば、上記の通り、 [ ]
などですね。「票」には [
が、「評」には ]
が含まれているのです。文字化けしたところにも、しっかり [
とか ]
が出ていることでも分かります。で、#informat
が TACL であるために [ ]
を処理してしまい、エラーになったというわけです。
なので、対策は特殊文字の処理を抑止することですね。つまり #informat
を plain
にすることです。
と入力すると、こうなります。
今度はエラーにはなりませんでした。(文字化けはしょうがない)
さあ、ここで #outformat
に戻ります。とり得る値は PLAIN
, PRETTY
, TACL
の3つでした。これによって表示が変わります。まずは TACL から。
おやおや、何だかまた怪しげな文字化けです。解説は後廻しにして、残りも見ておきましょう。
PRETTY
と PLAIN
はちゃんと出ましたね。ではそれぞれの解説です。
escape code
として ~
を付与して表示します。~_
のみ空白として処理します。ということなのですが、pretty
のところによく判らないことが書いてありましたね。~_
ってなんでしょうか。次のコマンドを実行してみましょう。
4行目で ~_
を使っています。3行目との結果の違いに注目してください。
結果はこの通りです。
“x
” が表示される場所が1桁ずれています。
では、#output
と x
の間にいくら空白を入れても表示の時にはすべて欠落してしまいます。PRETTY
の場合、~_
を空白として扱ってくれるので、表示の中に空白を入れることができます。
次に進む前に #informat
を TACL に忘れずに戻しておきましょう。
#setmany
についても、詳しく説明しましょう。GMT 時刻から JST 時刻に変換するときは #CONVERTTIMESTAMP built-in function
を使いました。この関数は戻り値を2つ持っていました。
このうち変換された JST だけ、つまり 212340112287808120
だけを他の variable
に代入するにはどうしたらいいかという問題でした。TACL のプロンプトで……
とやってみましょう。
Time1
には #CONVERTTIMESTAMP
の戻り値が2つとも代入されてしまいました。これではダメです。そこで、ひと工夫します。
を追加宣言して
ではどうでしょうか。
事態はさらに悪化してしまいました。
そこで登場するのが #setmany
です。複数の値を複数の variable
に分配してくれるので、
としてやれば
無事変換後の値だけ取り出せました。
#setmany
が処理できる variable
や値の数に制限はありません。
ちゃんとそれぞれ代入されています。また値の数と variable
の数が合ってなくてもエラーになりません。
大量の項目に展開させるマクロの場合、ここから後ろは要りません!ということもありますよね。その場合は必要な部分の variable
だけを書いておけば不要な項目は読み飛ばせるわけです。
頭や途中の項目が要らない!というケースもあります。その時は次のように記述します。
無事 30
と 31
が読み飛ばされました。“_
” に相当する部分を読み飛ばしてくれたのです。fl
マクロのケースでも #CONVERTTIMESTAMP
がエラーコードを返すことは考えられないので、
と書いても十分でした。実際エラー処理もしてないしね。補足で始めると言っときながら補足だけで終ってしまいそうですが、キリがいいので今日はここまでにしておきましょうか。あ、補足ついでにあと1つ。
TACL プロンプトで [
とだけ入力してみてください。
何も起こりませんね。それではさらに何かコマンドを入力してみてください。fileinfo
でも fup
でも何でもいいです。どうでしょうか。またまた何も起こりませんね。TACL がコマンドを一切無視しているかのようです。どうしてこうなるのでしょう。
[ ]
は variable
の展開でも使われますが、複数の処理や行をまとめる働きもあります。[
で始まり ]
で終わる一連の記述がブロックとして扱われますので、今は TACL がブロックの宣言を受け付けている状態になっています。この状態から ]
を入力すれば、ブロック宣言が完了して TACL はそのブロックを実行してくれます。それでは ]
を入力してみましょう。
やっと何かが起きましたね。これで TACL が生き返りました。めでたし、めでたし。
次回は fl
マクロの話に戻って、表示の成型をやりますよ。Au revoir!