知らなかったよ〜。
最近 perl 関連で教えてもろた事や知った事、メモ。
・Class::DBI のコネクションプール問題について
毎日エラーログ眺めてたら、MySQL に繋がらなくて500番エラーになってる箇所がたまにあった。
詳しく言うと、mod_perl の Apache::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_perl な CGIスクリプトには my でなくて our
ここに書いてあるように、
main で my 宣言した変数は、必ずサブルーチンの引き数として与えて使わないとヤバし。
our で代用すると良いとか言うけど、our は身体が拒否して書けません(笑)
ついでに、sub xxx と気軽にサブルーチンも書いちゃうけど、
エラーログが redefined のワーニングの嵐になっちゃうんで、
正確には package パッケージ名; で区切って、そん中に sub xxx を書き
main から パッケージ名::xxx で呼び出した方が良いざますー、との事。