mots quotidiens. | |
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp | by hns, version 2.10-pl1. |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
モデルなどの名前に "model.9" "model.10" .. などと数字を付けることは クラスタリング等でよくあると思いますが, この間IWSLT関係の仕事で, "model.0"〜"model.19" という名前がついたファイルを, それぞれ "model.1"〜"model.20" にリネームする必要があった。
for f in model.*; do rename 's/\.(\d+)$/".".($1+1)/e' $f doneとすればいいですが(マニアック!), 実は上のファイル名グロブ "model.*" は普通は 文字列としてソートされるため, "model.1" "model.10" "model.11" .. "model.2" のように展開されてしまうので, 上ではうまく行かない(ファイルがどれか失くなってしまう)。
ごく一般的に, 数字を含んだファイル名を数値の部分を考慮して並べたいことは
よくあると思いますが,
Macintosh System7 には数字を含んだ文字列を「自然に」ソートする
ための Stuart Cheshire 氏による"Natural Order" という素晴らしいINITが1994年頃
からあって (上の画像),
機能拡張フォルダに入れておくだけで, システムの文字列比較関数を書き換えて,
Finder等のファイルが期待した通りに並ぶようになる。
[Natural Order Numerical Sorting]
これには上の画像にあるようにソースが付いているので, 前からやろうと思っていた
通り, 週末にちょっと工作して Unix で使えるようにしよう.. と思って
少し調べたら, すでに誰かがやっていた;。まあ確かに, ごく自然に
考えつきそうなことではあるけれども..。
[Natural Order String Comparison]
by Martin Pool 氏。
このページには perl, C, Haskell, Ruby, Python, Java, Javascript による実装例
が載っていて, GNU ls では, "--sort=version" を指定すると常に natural order
ソートになるらしい。確認したところ, 確かにそうなる模様。
ただ, 上のファイル名グロブはシェルが行うものなので, 後は zsh にパッチを当てれば
いいかな.. と思って下調べをしたら, これもすでにオプションが存在していた。
ガーン。;;
setopt numericglobsortとしておくと, 最初の例のようなファイル名展開が "model.1" "model.2" .. "model.10" のように「自然な」順番になる模様。 これはX68000版の zsh のマニュアルに含まれる zshintro.jp に書いてあるので 読んでいたはずなのだが, 何となく見落としていたらしい。(;_;)
というわけで, まとめると
/* debug.c $Id: debug.c,v 1.3 2006/12/07 09:46:58 dmochiha Exp $ */ #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include "debug.h" #define DEBUG_FILE "log.debug" static FILE *dp = NULL; int dprintf (const char *fmt, ...) { int n; va_list ap; if (dp == NULL) { if ((dp = fopen(DEBUG_FILE, "w")) == NULL) { fprintf(stderr, "dprintf: can't open debugging output: %s\n", DEBUG_FILE); exit(1); } } va_start(ap, fmt); n = vfprintf(dp, fmt, ap); fflush(dp); va_end(ap); return n; }何も考えず, 普通に
dprintf("table[%d] = %g\n", i, table[i]);のようにすると, 固定ファイル(上では "log.debug")に結果が蓄積される。 必要なら, #ifdef DEBUG .. #endif で囲ってもいいかも。
可変長引数を取るのは Lisp では常識に近いのに, C言語の普通の講座では
ほとんど採り上げられていないような気がする。
最初にC言語を習った時に気になって
聞いたら, vararg.h を使えと言われたが, その当時はよくわからなくて使えなかった。
上は簡単な例ですが, 今頃になって大分わかってきたような気もする。
タイトル一覧 |