@magnolia_k_ さんが主催する、Kichijoji.pmの番外編である、Kichijoji.pm mini 初めてのPerl読書会(第2回)に参加してきました。
少人数で集まって音読し、気になる所をあーでもないこーでもないと意見しあう読書会です。
第1回も参加したのですが、あーでもないこーでもないしているとなかなか読み進まず、前回は「第2章 スカラーデータ」しか読めなかったのですが、今回もあーでもないこーでもないで盛り上がり「第3章 リストと配列」だけで精一杯でした。
とは言えPerlにおいてリストと配列はわりと最初のハマりポイントなので、じっくりやれて良かったんじゃないかと思います。
会場
今回の会場は(吉祥寺になかなかいい場所がみつからない事情もあり)武蔵境駅徒歩3分くらいのコワーキングスペース「ぴこす」でした。
小奇麗でアットホームなスペースでとても居心地が良かったです。
Facebookの写真で少しだけ屋内の雰囲気もかめます (https://www.facebook.com/picos.musashisakai)
あーでもないこーでもない
リストと配列(Array)はPerlでは別物 をみなで囲んで読みなら、とにかくリストはリスト言わず、リストコンテキストって用語で使わないと混乱するよねーって話してました。
コンテキストで返り値が変わるメソッド実装はよくあるので(例えばスカラコンテキストではイテレータ、リストコンテキストでは配列を返すメソッド)
理解が浅いうちに以下のようにしてしまい、なぜだー!ってなるの結構Perl怖い話だよねーって感じでした。
my ($all) = MyDB->get_all; # (で囲んでしまったら)リストコンテキストである!
# my $all = MyDB->get_all; # 正しくはこちら
while(my $item = $all->next){
print $item->id;
}
eachを配列に使うとインデックスを返す(>=5.12)
新しい発見としてはeachを配列に使うとインデックスを受け取ることができる機能が5.12から実装されていることが書かれていました。
use 5.012;
my @list = qw/mon tue wed thu fri sat sun/;
while ( my ( $i, $val ) = each @list ) {
say "$i: $val";
}
名言(迷言) 事実、Perl を学ぶことのうち大きな部分を占めるのは、Larry の考え方を学ぶことなのです
ここは一同苦笑いで読書が進まない感じでした。Larryさん。。。
通常はリストを生成するために使うような式はたくさんあります。そのような式をスカラーコンテキストで使うと何が得られるでしょうか? それを知るには、作った人が言っていることを調べてください。通常、その人物とは Larry であり、ドキュメントを読めばすべてが記述されてい ます。事実、Perl を学ぶことのうち大きな部分を占めるのは、Larry の考え方を学ぶことなのです*27 。ですから、Larry のように考えられるようになれば、Perl が何をするかが理解できるように なるはずです。
*27 これはそんなに大変なことではありません。なぜなら、LarryはPerlを書く際に、あなたのような人の立場に立って、どんなものが欲しいだろうかを予想していたからです。
要は、コンテキスト重要!ってことですかね(笑)人間のコミュニケーションでもコンテキスト(文脈)はとても重要ですから。
余った時間で少しだけサブルーチン
本当は4章サブルーチンまでやるはずだったのですが、リストで盛り上がりすぎて時間が微妙になってしまい、余った時間で少しだけ僕が最近はまったサブルーチン話題を共有しました。
PerlのデプロイツールであるCinnamonを導入しようとして設定ファイルを書いていた時に、DSLがあまりに(自分には)奇妙でした。
remote {
run "cd $deploy_to && git fetch origin && git checkout -q $branch && git submodule update --init";
} $host;
remoteがサブルーチンなのはわかりましが、引数が関数リファレンスっぽいのにsubが無いし、第二引数の前に,(カンマ)がない。なんじゃこりゃー。
[ソース]
(https://github.com/kentaro/cinnamon/blob/master/lib/Cinnamon/DSL.pm#L42)をみると、
sub remote (&$) {
my ($code, $host) = @_;
...
}
ということでサブルーチンのプロトタイプだったんですね。
http://perl-users.jp/modern_introduction_perl/sub_prototype.html
この辺りを読んである程度理解は出来たのですが、普通に書いたほうが混乱無いと思うんですけど、プロトタイプを使うメリットって…?
remote sub {
run "cd $deploy ..."
}, $host;
次回 サブルーチン
年内にもう一回読書会が開ければいいな、とのことなので、こんな感じであーだこーだ話したい人は是非参加していただきたく思います! (#kichijojipm か 主催の @magnolia_k_ さんをヲチすると吉)
@magnolia_k_ さんお忙しい中主催あがりがとうございました!!