perl

PerlとPHPのシンタックス差異

ものすごく久し振りにPHPでコードを書く必要性に迫られているのだけど、Perlに慣れ過ぎていて些細なシンタックスで躓きまくり。 sub {} ではなく function() {} elsif ではなく elseif splitの分割パターンはquoteで与える(正規表現が必要ないならexplodeを…

暗黙の第一引数invocant

すぐ名前を忘れてしまうのでメモ。Perlではオブジェクトのメソッド呼び出しにおいて、暗黙の第一引数として呼び出し元のオブジェクト情報が渡る。これをinvocantと呼ぶ。 sub method { my $self = shift; } invocantは上記のようにshiftで受け取るのが慣例。…

CGIから外部プログラムをバックグラウンドで実行する

非常に時間のかかる処理をCGIから行う場合、ブラウザが応答待ちのまま固まったり、タイムアウトによって処理が中断してしまうといった問題がある。こういった場合、forkを使ってPerlプロセス自身を複製するという手法もあるが、問題の処理は外部プログラムに…

LWP::UserAgentのタイムアウト判別

URIにアクセスできたけどエラーが返されたのか、そもそもアクセスできなかったのかを区別するのはどうすればいいのか、ということでちょっと悩まされた。 use LWP::UserAgent; my $ua = LWP::UserAgent->new; $ua->timeout(10); my $res = $ua->get($url); m…

無効コンテキストの罠

sub func1 { my $self = shift; my $result = $self->func2; } sub func2 { my $self = shift; $self->check_wantarray; $self->dummy; } sub check_wantarray { my $self = shift; print defined(wantarray) ? (wantarray ? 'ARRAY' : 'SCALAR') : 'VOID'; …

EUC-JPでマルチバイトを含む文字数を正確にカウントする

EUC-JPのシングルバイト文字のうち、コントロールコードを除いたASCII文字は[\x20-\x7E]。これはそのまま数えれば問題ない。 my $n = ($str =~ tr/\x20-\x7f/\x20-\x7f/); 一方、EUC-JPの2バイト文字は [\x8E\xA1-\xFE][\xA1-\xFE](うち\x8E[\xA1-\xDF]は半…

日時の書式を指定する

時刻をきれいに文字列にしたい場合、POSIXモジュールにあるstrftime()を使うことが出来ます。覚えておいても損はないでしょう。こちらも標準装備。 404 Blog Not Found:勝手に添削 - Ajaxでデバッグしよう - @IT 標準モジュールで整形してくれるの存在した…

パッケージ中のメソッド一覧を取得する

PHPならそのままget_class_methods()という関数があるんですが。あまりスマートじゃない気がしますけど、こんな感じでいけました。 no strict 'refs'; my @methods = grep { $_ !~ /::/ } keys %{"PackageName::"}; print join("\n", @methods); 実行された…

各種言語に対応した軽快なソースエディタ「Intype」

海外のmac環境Railsユーザに好評なTextmate。 Windows環境でも同じような(追いつき追い越せ?)センスでのエディタ開発が始まっているようです。 Windows Textmate!? - Intype Alpha 0.2.1: CakePHP のおいしい食べ方 という背景があるらしい、ソースエディ…

CGI.pmを使ってシェルからパラメータを受け取る

use CGI; my $q = new CGI; foreach my $key ($q->param) { print "$key : ".$q->param($key)."\n"; } ごく普通にnewするだけで何の工夫もなし。それだけで次のコマンドは期待通りに動作してくれる。 $ perl sample.pl "key1=Hello+World&key2=%a5%c6%a5%b9%…