風来坊@真幸福知

風来坊@真幸福知

始まりは坐禅会のご案内, 思いつくことを何でも書いていたら星空系に... Started with Zazen session info. now almost astrophotos. 시작이 참선회 안내, 이제 별하늘 사진들.

いまさらのGnuplotをwindows上で使う時... (\と/の件)

Linux (Unix)でいつも使っているものをWindowsに持っていくと, 時々うまく行かないことがある. よくあるのがパスのデリミタ(区切り文字)の違いによるトラブルだ. Linuxの場合は'/' (スラッシュ), Windowsでは '\' (バックスラッシュ, 通貨記号が表示されることもある).

Perlでデータの抽出などの処理をしたあとで, それをGnuplotで作図させるとかいうのはよくやる手なのだが, Perlにはこういうデリミタの違いに対して互換性をもったスクリプトを作るための道具として"File::Spec"というモジュールが提供されている.

use File::Spec;

my $file = File::Spec->catfile("data", "faro", "pmmass.txt");

@pathparts = File::Spec->splitdir($file);

こんな感じでcatfileという関数を使うと, $fileにはそのシステムのデリミタをはさんで連結されたパス(Windowsなら data\faro\pmmass.txt, Linuxならdata/faro/pmmass.txt)が入る. これを逆にパーツに分解するのがsplitdirということになる.

これでめでたし... と思っていたのだが, これを駆使して作ったPerlスクリプトで, Gnuplotのプロットスクリプトを生成するようにしていたらプロットするときにエラーが出てしまった.

gnuplot> load "ほにゃらら"

    warning: Cannot find or open file "k44\hi"

   No data in plot 

という具合である.

gnuplot> !dir k44\hi

とやると, ちゃんと"hi"というファイルはある.

しかしGnuplotの命令の文字列の中では'\'はエスケープ文字として扱われて'\hi'の場合は"hi"と同じことになり, 'k44hi'というファイルを探すことになるらしい. だから'\'を使うなら'\\'として, エスケープではない'\'なんだと分からせないといけない.

実はこんな面倒なことをしなくても, Windows上でもGnuplotでは'/'をデリミタとして使えば問題ない.(ということを今更知った) 何かうまくやってくれてるらしい. だから, Gnuplotスクリプトの中では, OSに与える命令(!で始まる行)でなければどこでも'/'でパスを区切ってよいのである.

この辺, ググってもあんまり情報が出てこないしGnuplotのhelpにも'delimiter'とか'path'という項はない. 常識なの?

50過ぎて学ぶことがやたら多くて焦る.

(汗)

追記:

ASCII.jp:Windowsのパス区切り文字は、なぜ逆スラッシュになったのか?|Windows Info

こんな記事があった. 終わりの方に, 今のWindowsはたとえばコマンドラインなどでは'/'をデリミタとして認識するらしい. 確かにやってみるとうまく行く.

C:\>cd Users/who

C:Users\who>

ただ, コマンドラインを入力する時のファイル名の補完(Tabを押すと続きが出てくるやつ)は'/'の後は効かないみたい.

それに,

C:\>dir Users/who

Invalid switch - "who".

C:\>

 dirコマンドでは'/'がオプション記号として認識されてしまうらしくダメ.

これでは中途半端でやっぱり使えない.