2007年03月27日

第4章 実践編1 メインフレームのデータの扱い(6) 〜ええ、とても〜

 「Pythonはいい言語ですか?」と聞かれたら、私はこう答えるでしょう。「ええ、とても」
 前回、いきなり"__init__"とか「イテレータ」とか出てきて面食らってしまった方もいるかも知れませんが、気にしないでください。「使わなければいいだけですから(*)」 これとは逆に興味を持ってしまった方もいるでしょう。そんな方はPythonの素晴らしく充実したドキュメント類を一読されているでしょうから、今さらくどくどと説明はしません。
(*)Pythonの入門コースインスタント・パイソンは、こんな調子です。いいですね。

 ここでは、固定長のレコードを扱う"FBrec"というクラスを作ってみました。
同様に細かな説明はしません。なんせ「最低限の仕事は終わっていますから」

class FBrec:

def __init__(self, rec, codec=None):
self.rec = rec
self.codec = codec

def hexList(self):
pfmt_scl = '%5d....+....1....+....2....+....3....+....4....+....5' \
'....+....6....+....7....+....8....+....9....+....0'
pfmt_data = '    %s'

for i in range(0, len(self.rec), 100):
_line = self.rec[i:i+100]
_hex = [ '%02X' % ord(ch) for ch in _line ]

print pfmt_scl % i
print pfmt_data % ''.join([visible(ch) for ch in _line.decode(self.codec)])
print pfmt_data % ''.join([ch[0] for ch in _hex])
print pfmt_data % ''.join([ch[1] for ch in _hex])

def isVisible(ch): return 32 < ord(ch) < 127
def visible(ch):
if isVisible(ch):
return ch
else:
return ' '


 PythonにかぎらずLL(Lightweight Language)での変数の扱いは、COBOLのそれとはずいぶん違っています。
 COBOLであれば"VAR1 PIC X(20)"などとして、あらかじめ記憶域上に領域を確保してから使用しますが、LLではそれが動的なのです。
 Pythonはさらに純粋なオブジェクト指向言語ですから、数値、文字なども「オブジェクト」であり、例えば var1 = "ABC" は、「var1の記憶域に値ABCを書き込む」のではなく、「変数var1にオブジェクト"ABC"への参照を代入する」ことになります。
 また、Pythonのドキュメントを読むと、「文字列は変更不能」となっています。最初のプログラムでは、気軽に「+=」を多用していましたが、オブジェクトの生成を繰り返していたことになります。「文字列処理は高くつく」のです。
 というわけで、今回は2.1 組み込み関数の説明に、「文字列からなるシーケンスを結合する高速かつ正しい方法は ''.join(sequence) です。」とありますので、文字列を結合するためjoinを使いましたが、実はこの程度のプログラムでは「+=」を使ってもまったく問題はなく、前回の「投資対効果」の観点からは、むしろこちらのほうが手早く簡単にできる分だけ「LLの良さを活かせている」ことになるのかもしれません。
文字列の扱いについてはJAVAも同様なのですが、、「軽快なJAVA」という本でも、教科書通りStringBufferクラスを使った例と、「+」を使った例をあげ、明らかに「+」を使ったほうが短く簡潔に記述できるので、どんどん向上するVMの性能を考えると、できるだけシンプルな方法をとるべきではないかと主張しています。

_lineのアンダースコア"_"ですが、プライベートな変数であることを表す時に使う慣習のようです。2つ続けると、よりプライベート性が強くなって、Pythonのほうでもプライベート変数として扱ってくれます。

 リストの内包表記[f(x) for x in list]は使ってみれば便利なものです。

 def isVisible(ch)ですが、こんなことをする必要はまったくなく、普通にif文で書けば良いのですが、これも「やってみたかったから」です。引数chがASCIIコード値で可視文字の範囲にあればTrueを、それ以外(タブ等)であればFalseを返します。

 まとめると、以下のファイルになります。
FBfile.py

呼び出し例は次のとおり、
FBfile_xxfile.py
(キーをあらかじめエンコードしてから比較しているのは、巨大なファイルの考慮です。)
posted by ymd at 19:40| Comment(0) | TrackBack(0) | 第4章 実践編
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/3608396

この記事へのトラックバック