2012年7月1日日曜日

Perl Beginners #3 レポート


このエントリーをはてなブックマークに追加


大まかな内容は他の人のレポートにまかせますw

初心者セッション?で発表されていたのは、以下のようなコードでした。
https://github.com/studio3104/out-exec-mysql-slowquery/blob/master/explain2.pl

その場でいろいろ突っ込みは入ったものの、
納得できてもいきなり書けるもんじゃないと思うので、次の日にちょろっと書いてみた。
15分くらいだったから当日その場で書けばよかった気もしますが、無線持ってないもんで、、、、。

https://github.com/tokubass/out-exec-mysql-slowquery/blob/master/explain2.pl

動作確認してないので、参考程度にお願いします。
んで、要点としては


if文のネストは避ける & 長いifのあとにelseがくるのを避ける

方法は、elseの処理がreturnやnextであれば、



if(hoge){
# 20行くらいの処理
}else{
return;
}


は、



unless (hoge){
return;
}
#以下、ifが真のときの処理


のように書けます。
if文頭に、「受け取ったJSONをそのままMessagePackにして放出」と、elseの処理をコメントで書いてありますが、これが必要だったのはelse文がすごく下のほうに書いてあるためだと思われます。


正規表現はマッチすれば真を返す

ので、以下は冗長で、



my ($db) = ($decode->{sql} =~ /^use ([^\;]+)/i) if ($decode->{sql} =~ /^use [^\;]+/i);


は、



if ( $decode->{sql} =~ /^use \s+ ([^\;]+)/xi ) {
$db = $1;
}


でOK.


後置ifとmy宣言の組み合わせはダメ絶対

上記の正規表現で出てきましたが、
perldocによると、



注意: (my $x if ... のような) 条件構造やループ構造で修飾された my 文の振る舞いは 未定義 です。 my 変数の値は undef かも知れませんし、以前に代入された値かも 知れませんし、その他の如何なる値の可能性もあります。 この値に依存してはいけません。 perl の将来のバージョンでは現在のバージョンとは何か違うかも知れません。 ここには厄介なものがいます。



なので、気をつけましょう。
また、PBP(perlベストプラクティス)に従うならば、後置ifはnextやreturnなど、制御の流れを変えてしまうようなものを目立たせるためにのみ使うと書いてあります。


その他



  • hashの使い方がおかしかったので修正

  • @でデリファレンスするとき、リファレンスが配列を指してないと落ちる。元コードはdefinedで空かどうかだけチェックしてたのを、refで配列かどうかのチェックに変えてみた。



ちなみに、
'ARRAY'や'HASH'のかわりに、[],{}もよく使われます。


お疲れ様でした


お題がDBということもあって、「perlは専門じゃないインフラエンジニア」が集まってた感もあって良かったんじゃないでしょうか。





0 件のコメント:

コメントを投稿