tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

サブルーチンの引数の受け方

これは良記事なので、紹介しときます。
現代的なPerlの記述方法一覧 + α - Perl入門〜サンプルコードによるPerl入門〜

Perl5.8以降における標準的なPerlの書き方を解説します。インターネットで検索するとPerl4のころの古い記述がたくさんあります。また書籍などの多くもPerl4の記法で書かれています。Perl4の記法は複雑になりやすく間違いを生みやすいのでこれからPerlを書く人はPerl5の現代的な記法で記述することを強くお勧めします。

と、言うわけで、腕に覚えの(ない|ある) Perler は是非ご一読を。

で、サブルーチンの引数の受け方を見て、ちょっと思ったこと。(元記事に対してのよしあしじゃないです)

私は、サブルーチンの引数は必ず

sub hoge {
    my( $arg1, $arg2 ) = @_;
    # ...
}

の形式で受けてます。(捨てコードでは無意識のうちに shift も使ってるかも)。なぜこの書き方をしてるかというと、多分サブルーチンの引数をとる部分をプロトタイプ引数みたいに読んでいるから、だと思います。

で、オブジェクトのメソッドの場合は、

sub hoge {
    my $self = shift;
    my( $arg1, $arg2 ) = @_;
    # ...
}

と、$self だけ shift で受けて、残りは my( $arg1, $arg2 ) = @_ の形式で受けてます。マイナーな流儀のは知っていますが、この書き方だと、オブジェクトのメソッドとクラスメソッド(とかユーティリティー系)をぱっと見で区別できる。($self も一緒に @_ で受けてもぱっと見でわかるだろうから、完全に好みの世界なのだろうけど)

あと、委譲を含め、ほかのサブルーチンへの丸投げがやりやすい。

sub hoge {
    my $self = shift;
    #...
    $self->hoge2(@_);   
}

みたいに書けるから。

sub hoge {
    #...
    hoge2(@_);  #self も一緒に丸投げ
}

は気持ち悪い。

でもこの書き方だと、Catalyst と相性悪いんだよね。$self を shift で受けたとして、じゃあ $c も shift で受ける?うーん受けないだろうなぁ。。。

というわけでスタイルを変えようかどうか、悩み中なのであります。