風来坊@真幸福知

出雲市 福知寺 行事ご案内 坐禅会 日記 テクノロジー English Zazen session technology Korean 한국어 참선 묵조선 텍놀로지

いまさらの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コマンドでは'/'がオプション記号として認識されてしまうらしくダメ.

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