弐条海月の とはずがたり

そこはかとなく書き綴るブログなるもの

HSPでのループ処理とか…

 Windowsで動作するフリーのインタプリタ型プログラム言語「HSP(Hot Soup Processor)」にて、仕事の中で行う作業を補助するアプリケーションを数々自作しておりますが、時々思い立って突然プログラムを書き始めることがあり、そういう時は集中してダーッと書いていくので後でソースを見返すと「力技(ちからわざ)にてゴリ押ししているところがたくさんあったりして笑えます。今日はその一例を挙げてみようと思います。

 今日ご紹介するソースは、週1回、取引先からメールで届くテキストデータを、自動で整形してこちらの欲しい形式に変換するアプリケーションです。確か以前、この日記の中で書いたことがあったと思います。立ち上がったプログラムのウインドウにメールの文章をコピー&ペーストして「処理開始ボタン」を押すと、文字列の整形処理が瞬時に行われ、成型後のデータが表示されるというものです。私はこうやってできたデータをさらにコピーしてIllustratorのテンプレートに貼る作業をしております。手作業でやる場合に比べると大幅な時間短縮になり会社的にはコストが削減できるのは言うまでもありませんが、それより何より、私の精神衛生上とてもよろしいのは言わずもがなプライスレスです(爆)。

 それでは、ダーッと書いたソースの一端をお見せします。これは先述した自作モジュールを使った文字列置換の処理の部分です。

W_QA(0) ="‡1‡" : W_QA(1) ="" : K_REP_S CHANGE_DATA,W_QA
W_QA(0) ="‡2‡" : W_QA(1) ="" : K_REP_S CHANGE_DATA,W_QA
W_QA(0) ="‡3‡" : W_QA(1) ="" : K_REP_S CHANGE_DATA,W_QA
W_QA(0) ="‡4‡" : W_QA(1) ="" : K_REP_S CHANGE_DATA,W_QA
W_QA(0) ="‡5‡" : W_QA(1) ="" : K_REP_S CHANGE_DATA,W_QA
W_QA(0) ="‡6‡" : W_QA(1) ="" : K_REP_S CHANGE_DATA,W_QA
W_QA(0) ="‡7‡" : W_QA(1) ="" : K_REP_S CHANGE_DATA,W_QA
W_QA(0) ="‡8‡" : W_QA(1) ="" : K_REP_S CHANGE_DATA,W_QA
W_QA(0) ="‡9‡" : W_QA(1) ="" : K_REP_S CHANGE_DATA,W_QA
W_QA(0) ="‡10‡" : W_QA(1) ="" : K_REP_S CHANGE_DATA,W_QA

 ざっと説明しますと、W_QAというのは文字列置換用に用意した配列変数です。W_QA(0)が置換対象の文字列、W_QA(1)が新たに置き換える文字列です。で、実際の命令がその後ろに記述している「K_REP_S CHANGE_DATA,W_QA」の部分です。こんな命令は本来HSPにはありません。HSPは標準では文字処理の命令が弱いので、自分で書いた文字処理用モジュール「kurage_mod」を使って色々なアプリケーションを開発しているのです。この命令「K_REP_S」もそう。特に文字の置換については自分で開発したモジュールがあるとえらく開発が進むので、自画自賛ですが重宝しております(笑)。余談ですが、自作の文字列置換命令「K_REP_S」は1度だけ実行する命令。対象の文字が何ヶ所にもわたり、そのすべてを置き換えたい場合のために「K_REP」という命令も用意してあります。

 さて、サンプルソースの1行目の場合ですと「”‡1‡”という文字列がテキストデータ上にあったならば取り去ってしまえよ」という意味になります。「‡」という普段使わない文字を使っているのは、間違いなく置き換えができるようにするためです。実はこのソースはプログラムの後半に出てくるもので、前半にも同じような処理があり、そこで「‡」を追加しているのです。理由は先ほども書いた通り通常使われない文字だから。プログラム序盤で「‡」を加え、中盤の整形処理で「‡」に囲まれた数字は通し番号だという認識をさせておき、サンプル部分の終盤で役目を終えた通し番号を削除する…そんな流れです。

 さて、サンプルソースに話を戻して…。同じような記述が10行にもわたって書かれていますね。我ながら恥ずかしいです(笑)。こんなのループ処理でもっと短く書けるだろう?って思いますよね。私の場合、気分が乗っている時は思考の流れを止めたくないので、ついループ処理などを後回しにしてしまいます。そのために膨大なプログラムを書くことになり、あとでソースを見直すと2分の1から3分の1位くらいの行数になってびっくりすることもあるくらいです(笑)。

 上記のサンプルをループ処理を使って書き直すと以下のようになりますよ。

W_QA(1) =""
repeat 10,1
	W_QA(0) ="‡" + cnt + "‡" : K_REP_S CHANGE_DATA,W_QA
	await
loop

 もうどうしようもないくらい短くなりましたね(笑)。これで先ほどのソースと同じ動作をします。repeat命令はHSP標準のもの。repeatの後ろのパラメーターの10は10回リピートせよという意味です。同じくパラメーターの1は、リピート中回数を示すシステム変数cntの始まりの数値をデフォルトの0からではなく1からにせよ、という意味です。あとは自作モジュールの命令「K_REP_S」で置き換えをしています。

 今回手を入れたアプリは、先日作った日々変わるテンプレートを簡単に用意できるアプリと関連性があるので、できれば統合したいところなのですが…他にもやらねばならぬことが山積しておりますので時間ができたなら着手したいと思います。

 それと、以前はこのモジュール「kurage_mod」を公開していたのですが、日記をWordPressにしてからそのページが非公開になってしまいました。もう少ししたら、そのページを書き直しモジュールを公開したいと思います。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

固定ページ

最近の投稿

カテゴリー





カレンダー

2011年3月
 123456
78910111213
14151617181920
21222324252627
28293031  

過去の日記はこちら

キーワードで検索