パスワードを忘れた? アカウント作成
449827 journal

T.MURACHIの日記: りふぁ~

日記 by T.MURACHI

正月に仕事で中国へ行っていた親父が、JAL で安かったからとお土産によこしてくれた山崎 (12 年) をロックで飲みながら。正直、サントリーのウィスキーは全般的にあんまり好きじゃなかったりするのですが (^_^;、この山崎も後味にちょっと渋みが乗る感じがやっぱりどうも苦手だなぁなどと思いつつ。。。

前回の日記で、「せめて共有型 TODO リストでも作って~」などと書いた私ですが、実は個人的な理由あって、まさにその共有型 TODO リスト (CGI として動作するやつ) を Perl でシコシコ作っていたりします。それなりに形になったらはらぺこでも公開する予定。

んで、去年、実は別の目的でラクダ本の第3版を購入していたりするのですが、そいつが今ごろになって大活躍中だったりします。

私は Perl は 4.x な感じの書き方でしか書けない人だったりするのですが (とか言いながら型グロブとかもさっぱりだったり…)、なんでもかんでも値渡しにするとさすがにパフォーマンス的に辛かろうと思ったので、今回はちょっと積極的に参照渡しを使ってみようかと思いまして。Perl の「リファレンス」は C++ や Java なんかのそれと比べてもすんごくややこしくて、基本はファニー文字を重ねるだけなんだけど、

$reference = \$referent;
$value = $$reference;

配列への参照の場合は -> 演算子とかも使えちゃったりして、非常にややこしい。

$reference = \@referent;
$value_0 = $$reference[0];
$value_1 = $reference->[1];

配列の要素が配列への参照を持っていたりする場合、-> 演算子は省略することもできちゃったりするので、更にややこしい。

$reference[0] = \@referent;
$value_00 = $reference[0]->[0];
$value_01 = $reference[0][1];

この辺がいまいちよく分からなくて、今までリファレンスを使うのは避けていたんだけど、今回改めてラクダ本を読んでみたら、

この 2 番目の文は、*a[i] を「ai 番目の要素が指すもの」という意味で使うことに慣れている C プログラマを狼狽させるかもしれない。しかし、Perl では、5 つのファニー文字 ($ @ * % &) は、ブレースやブラケットよりも強く結合するのである。

なんて書いてあって、「ああ、そういうことだったのかぁ~」と、目を見開かされる思いをしました。

どういうことかというと、例えば参照先の url な文字列をデコードするようなサブルーチンを書こうと思って、

sub decode_url {
$$_[0] =~ tr/+/ /;
$$_[0] =~ s/%([0-9a-f][0-9a-f])/pack 'H2', $1/ieg;
}

なんて書いてしまうのはまちがいで、

sub decode_url {
${$_[0]} =~ tr/+/ /;
${$_[0]} =~ s/%([0-9a-f][0-9a-f])/pack 'H2', $1/ieg;
}

のように書かなければならない、ということなんですね。むぅ。

やっぱり、ちゃんと物を作ろうとするときに、ちゃんとした参考書というか教科書というのは、やっぱりどうしても有用になってくるものなんだなぁとつくづく実感してしまう限りなのでございます。。。

ところで、Perl5 だと標準で CGI とかいうモジュールが使えたりするわけですが、こればっかしは今回は使わずに、リクエストやクッキーは自前で処理するようにしちゃっています。こういう事を書くと「まぁた車輪を再発明しちゃってこの人は。。。」なんて言われてしまいそうな気がするのですが、正直この CGI モジュールとやらが使い勝手のよろしいシロモノであるとはどうしても思えないもので。。。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

犯人はmoriwaka -- Anonymous Coward

読み込み中...