Hatena::Groupperl

Perl Tech RSSフィード

2012-08-29

[]Perlでインラインコメントは書けるのか? はてなブックマーク - Perlでインラインコメントは書けるのか? - Perl Tech

「リーダブルコード」を読んでアイデアが浮かんだので久しぶりに更新。今回はPerlにおけるインラインコメントについて考えたい。インラインコメントとはコードの途中に記述可能なコメントのこと。C言語でお馴染みのコメント方法だ。以下はリーダブルコードより抜粋

// 引数にコメントをつけて関数を呼び出す
Connect(/* timeout_ms = */ 10, /* use_encryption = */ false);

Perlでは#~行末までが全てコメントになる(ラインコメント)。この「行末まで」を途中で止めることができればインラインコメントが可能になるわけだ。しかしPerlの言語仕様上、どう頑張ってもコメントを途中で終わりにすることは出来ない。で、妥協して考えたのが以下のハックである。

sub fullname {
    my ($myouji, $namae) = @_;
    return "$myouji $namae";
}

print fullname( /(?!)# myouji = /x, "tanaka", /(?!)# namae = /x, "taro");

はぁ?もはやリーダブルじゃねーぞ、と思うだろうが説明しよう。/(?!)# myouji = /xというのは正規表現であり、最後のxは「空白とコメントを無視する」というオプションである。

問題は最初の(?!)だろう。なぜこれが必要なのかというと、単なる//xだと「無」にマッチすることになりマッチが成功してしまうため、(?!)をつけることで意味を逆にして意図的にマッチを失敗させているのである。これによって評価が偽になるので、正規表現の評価結果はサブルーチンに渡されなくなる。

しかしこの方法は欠点があり、暗黙の$_評価があるため$_に何らかの値が入っているとマッチ成功になってしまう。従ってこの方法は使えない。他にはもう方法が思いつかなかった。

結論

インラインコメントは無理

tokuhiromtokuhirom2012/08/30 10:15そもそも Perl の場合、パラメータがおおい場合は fullname(timeout_ms => 10, use_encryption => false) のようにハッシュでわたすので必要ありませんね。この方法はC言語の貧弱さをおぎなうためのBKなのでは?