Bluepostech

プログラムとかはこっち

【gnuplot】エラー:セミコロンがないと怒られるときにやること

gnuplotスクリプトを書いていると、しばしばいらっとくるエラーが出る。とてもよく出るものが以下のエラーだ。

 "hoge.plt", line xx: "; expected

これは見てわかる通り「セミコロンがない」と怒っているもので、初心者だと「???」となるのである。

そもそもgnuplotでセミコロンにはどのような役割があるのだろうか。それはシェルスクリプトと同じく、「1行に複数のコマンドを詰め込むときにそれを区切る」という役割だ。たとえば

 fit f(x) "data.txt" using 1:2 via a,b;plot f(x)

で最小二乗法でフィッティングした後そのままプロットできる。ただしスクリプトではそもそも改行すればいいだけの話なので、スクリプトを書く上では役に立たない。

僕がこのエラーメッセージに遭遇したのは、要約すると

plot "hoge.txt" ,\
"foo.txt" ,\
"bar.txt"

のように、逆に1つのコマンドに改行を含むコードを書いたときだ。なので改行がらみで問題が出たのではと疑った。しかし直らないときは直らないのだ。

実は、原因は単なる「スペルミス」だった。

たとえば

 plot "hoge.txt" with line linetype 1 linewidth 3 title "hoge"

といったコマンドを打ち間違えて

 plot "hoge.txt" with line linetype 1 linewidth 3 tytle "hoge"

と打っていたとしよう。するとgnuplotは「tytle」という単語がplotのオプションにないので、別のコマンドと認識する。なので「この行には複数のコマンドが詰め込まれている」と解釈し、セミコロンが必要だ、と注意するのだ。

なので、実際に「セミコロンがない」と怒られたときは、スペルミスがないかじっくりコードを見直す。つまり対策は「丁寧にやりましょう」としか言いようがない。だがヒューマンエラーを減らす方法として、簡単にできるコマンドは簡単に書くということがある。たとえば上記のコマンドは次のように省略できる。

 plot "hoge.txt" with l lt 1 lw 3 title "hoge"

こうすれば間違って「linetipe」などと打ってエラーが出ることもない。withも略せた気がするが、個人的にはなぜかwithだけは略したくない。もちろん略しても略さなくても正しく打ってる限りはエラーはでない。