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コマンドでは'/'がオプション記号として認識されてしまうらしくダメ.
これでは中途半端でやっぱり使えない.