朝からバイトへ。午前中の間、細々としたデータ管理のための Perl スクリプトを書いてました。やはり Perl は素晴らしい!!!いかに研究室の友人から罵られようと、僕は Perl の素晴らしさを高らかに謳い上げましょうぞ。
午後から某スタッフの仕事で、事務所にて照明・音響関係の業者と打ち合わせ。やはり、業者によって得手不得手があるようで、ここの業者は照明が得意で、音響は身内の会社、舞台は完全に外に出す、という感じになっているようです。それなら、舞台は舞台だけで安い業者を探した方がお得。あちらにとっても、舞台を一緒に頼んでもうまみはあんまり無いようですしね。
しかし、某レンタルフランチャイズ店の見積もりの驚異的な安さはいったい・・・。トラスが他の会社の見積もりの1/3くらいなんですが・・・。よく見ると、他の音響機材とかも1泊分の値段で出ているので、1/3くらいになってるし・・・。これは攻めの価格設定か!?トラスに関しては、機材を自社で持っているということも大きいのかも知れません。また、時期が時期だけに、機材も余っているので安くしてくれているのかも・・・
perl用byaccのサンプルコードから。ポイントは catch 内の next outer;
# catch signals sub catch { local($signum) = @_; print STDERR "\n" if (-t STDERR && -t STDIN); &yyerror("Floating point exception") if $signum = 8; next outer; } $SIG{'INT'} = 'catch'; $SIG{'FPE'} = 'catch'; select(STDERR); $| = 1; select(STDOUT); &next_file; # main program outer: while(1) { $line = ''; eval '$status = &yyparse;'; exit $status if ! $@; &yyerror($@); }
ほげーーーー
追試。
sub hoge { next outer; } outer: { print "x"; hoge(); print "y"; } outer: { print "z"; hoge(); print "w"; }
出力は xz でした。なるほど・・・。なんかこのシステムだけで例外処理を実装できそうです……。ハンドラの関係などで eval { ... die; ... } が使いにくい場合はいかがでしょう?
try: { $exception = ''; ... func(); ... } if ( $exception ne '' ) { if ( $exception =~ /IOException/ ) { print "IO Error"; exit; } else { next try; } } sub func { ... open(...) or raise("IOException"); } sub raise { $exception = $_[0]; next try; }
next じゃなくて last でも可。というか、意味的には last ですね・・・
> 研究室の友人から罵られ
なぜperlを使って罵られるんだろう...
うちの研究室的には perl なんてものを愛好すること自体が罪のようです(笑)まぁ、文法的にも意味論的にもむちゃくちゃ汚いのは間違いないですしね。