frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

知らなかったよ〜。

最近 perl 関連で教えてもろた事や知った事、メモ。

Class::DBI のコネクションプール問題について

 毎日エラーログ眺めてたら、MySQL に繋がらなくて500番エラーになってる箇所がたまにあった。

 詳しく言うと、mod_perlApache::Registry 使ってて、とあるモジュールん中から

 Class::DBI::mysql を継承したO/Rマッピングなモジュール達を使っていた訳ですが。

 apache のMaxClients の数と、MySQL のプロセス数の関係がよくなかったんだかなんだか?

 各apache なプロセスさん達が、MySQLのプロセスさん達を掴んで離さないんだかなんだか??

 アクセスが多くなってくると、一部のプロセスは MySQL に繋げられなくなっちゃったみたい???

 あ、ごめん。昨年の話だし、ちゃんと聞き逃した部分もあるから、記憶があやふやだ。

 で、確か、そもそもコネクションプールはっちゃうって、どーなのよ?って話になって

 同僚さんが調査したら、こんな答えが。

 Ima::DBI のバージョンが 0.34 だったのがよろしくない模様。

 とは言え、そう簡単に稼動中の全サーバーの Ima::DBI をバージョン変えるのは怖いんで

 db_Main をオーバーライドしつつ、connection と set_db は使わないって対策を取るのが良いようで。

・use base は、いろんな風に表現出来る

 元同僚のNねぇさんと一緒に、各モジュールの継承関係を追ってたら

 use base の書き方について疑問が発生。

 「use と base の間は、半角スペース以外入ってもいいのか?」

 答えは、改行・半角スペース・タブのどれを、バシバシ入れても問題なし。

 結局、base の後に ; が出てくるまで、ちゃんと認識してくれちゃうので

use base qw(Class::DBI);

 だろうが、

use

base qw(Class::DBI);

 だろうが、認識してくれちゃうんだな。べっくらこいた。

・for もグルグルは $_

 今まで for 使う時は for (my $i = 0; $i < 10; $i++) みたいに使ってたんで

 foreach みたいに使う時に、$_ が使えるとは思ってませんでしたん。

 例えば、こう。

for (0x61..0x7a) {

print chr($_)."\n";

}

 0x61 から順に $_ に入ってくれるのね。ははぁ。

・switch 文が標準で使えた

 びっくりした。いつから標準モジュールになってたんだよ、switch。(5.8.0かららしい)

 てな訳で、こんな風に使うだ。default の代わりに else なのと、break が要らないのが特徴。

#!/usr/bin/perl -w

use strict;

use Switch;

my $testString = 'anigon';

switch ($testString) {

case 'ANIGON' {

print "ANIGON\n";

}

case 'anigon' {

print "anigon\n";

}

else {

print "default\n";

}

}

exit;

・reverse はハッシュにも有効

 気付かなかった(笑)

 キーと値と入れ替えるのに使えるんだね orz

#!/usr/bin/perl -w

# ------------------------------------------

# main

# ------------------------------------------

use strict;

my %hash = (

'aaa' => 111,

'bbb' => 222,

'ccc' => 333

);

&_show(\%hash);

my %reverseHash = reverse %hash;

&_show(\%reverseHash);

exit;

# ------------------------------------------

# function

# ------------------------------------------

sub _show(\%) {

my $refHash = shift;

foreach my $key (keys %{$refHash}) {

print "${key}\t$refHash->{$key}\n";

}

}

# end of this script

mod_perlCGIスクリプトには my でなくて our

 ここに書いてあるように、

 main で my 宣言した変数は、必ずサブルーチンの引き数として与えて使わないとヤバし。

 our で代用すると良いとか言うけど、our は身体が拒否して書けません(笑)

 ついでに、sub xxx と気軽にサブルーチンも書いちゃうけど、

 エラーログが redefined のワーニングの嵐になっちゃうんで、

 正確には package パッケージ名; で区切って、そん中に sub xxx を書き

 main から パッケージ名::xxx で呼び出した方が良いざますー、との事。