• ベストアンサー

Perlでのselfの書き方

お世話になっています。 今他人が作ったPerlのプログラムを見ているのですが、 その中で、 パラメータを受け取る部分が、、、 sub hogehoge { my $self = shift; my ($one, $two) = @_; .. bra bra bra } と言う感じになっています。 またPerl初心者ですが、私の調べたところでは、 この二つの行は同等の意味なので、 sub hogehoge { my ($self, $one, $two) = @_; ... bra bra bra } と一行でかけてしまうと思うのですが、 $selfと$one, $twoを2行に分けている理由とか あるのでしょうか。 $selfだけ2行目の方法ではかけないとか? それともただ単に、 my $self = shift; と1行目に書くのがならわしだからでしょうか。 詳しい方が居ましたらよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

まず最初に答えを書いてしまうと「どちらの形式でも動作するが, 論理的な意味を考えれば前者の方がイメージにマッチする」ということになるかと. メソッドを $obj->method($arg1, $args); のように起動した場合, メソッドの最初では @_ = ($obj, $arg1, $arg2) の関係にあります. しかし, 意味を考えれば @_ = ($arg1, $arg2) となっている方が自然であり, そのようにするにはまず最初に my $self = shift; のように shift を行う必要があります.

sforest
質問者

お礼

ありがとうございました! もやもやがとれました!

その他の回答 (2)

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.3

No.1さん、No.2さんの回答もそのとおりですが、もうひとつ。 Perl のメソッドでは、$_[0] はオブジェクトと決まっています。 これを格納する変数名を $self に統一するのはソースを見易くする効果があります。 加えて、先頭に my $self = shift; と書く様に統一すれば、さらに見易くなります。 # 動かないソースコードを睨んでいる時、$self の格納が正しくできている事が一目で判るのは、重大なメリットです。

sforest
質問者

お礼

最初一行のほうがシンプルで いいのになんでだろう って思っていたのですが、 たしかにいわれてみればそのとおりですね ありがとうございました!

回答No.2

hogehogeの中でその後@_を使うのでなければ一緒だと思います。

sforest
質問者

お礼

ああなるほど @_そのままパラメータでループさせたい場合などは 先に、selfはとってしまったほうが便利なのですね! ありがとうございました

関連するQ&A