バージョン番号の比較(というかソート)ってどうやってます? ちょっと作ってみたけど…完全ではないなぁ。
これだと文字数で0を足しているだけなので、整数だけとかアルファベットだけならいいけど「9a」(9にパッチが当たった想定)と「10」で、「9a」が後になってしまう。jpegのライブラリとかこういうスタイルだったよな確か。
例えばLinuxみたいに2.6.8-bk1と2.6.8-rc1があってrc1のほうが後だってのはプログラム上はどうするべきなんだろう。Firefoxみたいにrcとprの違いとか。あと、例えば「rc1a1」と「1rc2」みたいなあまり互換性がなさそうなつけ方があったとして、どっちが後とするべきなんだろう。rpmのソースとか見てみようかな。
#! /usr/bin/python import string def fix_length(x,y): m=max(len(x), len(y)) x.extend("0"*(m-len(x))) y.extend("0"*(m-len(y))) return x,y def fix_length_str(x,y): m=max(len(x), len(y)) return x.zfill(m), y.zfill(m) # "n.n.n-n.n.n" def compare_version(x,y,spl=''): # split "-" # print "cmp0", x,y if len(spl)==0: # return cmp(string.atoi(x),string.atoi(y)) x,y=fix_length_str(x,y) return cmp(x,y) x1, y1=x.split(spl[0]), y.split(spl[0]) x1, y1=fix_length(x1, y1) for i in range(len(x1)): r=compare_version(x1[i], y1[i], spl[1:]) if r!=0: return r return 0 if __name__=='__main__': a=["1.0.0", "0.90", "0.1", "0.9", "0.10", "1.2.5", "1.2.5-10", "1.2-20", "1.2.5-9"] a.sort(lambda x,y: compare_version(x,y, "-.")) print a
結果は以下。
['0.1', '0.9', '0.10', '0.90', '1.0.0', '1.2-20', '1.2.5', '1.2.5-9', '1.2.5-10']
glibcのGNUの拡張でstrverscmp()という関数が使えるようになってますね。