Perlにおけるtry catch
最近はJavaを書くことが多かったので、偶にPerlを書くとついついはまりがち。
Perlにおいてエラーなんかをトラップするための方法として、evalがあります。
http://perldoc.perl.org/functions/eval.html
で、まず一つ目としてこのevalはあくまで「関数」であって、構文ではありません。具体的にいうならば、
a = 1 / 0;
というものに対して、try catchをするのであれば、Javaならばこうすればいいわけです。
try{ a = 1 / 0; }catch(Exception e){ }
Perlの場合、同様の方法として、eval{}; if($@){}というのがありますが、この場合、evalの後ろのBLOCKの後に、必ずセミコロンが必要です。ifの後ろには要りません。どれだけ長いBLOCKであっても、セミコロンを付け忘れるとエラーです。
次に、もう一つの問題として、returnというのがあります。例えば長い関数なりメソッドがあったとして、この関数に後からエラートラップを導入するとします。その際に、
sub hoge{ eval{ #do something die; #do something return $a; }; print $@ if($@); }
としてしまうと、$aは結局returnされません。return $aの返る先は、あくまでeval文です。evalの返り値が$aになるので、これをちゃんと変数で受けてやって、その上でreturnしてやる必要があります。
ということで、2Dの実装で一番はまった部分でした。