1

fast_cgi 経由で呼び出している 2 つのネストされたパッケージがあります。最初のパッケージから、次のように 2 番目のパッケージからメソッドを呼び出しています。

$MyScalar = "A Value";
MyPackage::Inner->InvokeMe($MyScalar);

私の他のパッケージから、次のようにパラメーターを巻き戻しています。

sub ZonesByCustomer($)
{
    my $MyParameter = @_[0];
    print $MyParameter;
}

私が期待しているA Valueのは、印刷されることですが、実際に印刷されるのはMyPackage::Inner. A Valueに実際に格納されてい@_[1]ます。

これは紛らわしいようです。パッケージ名がパラメータとして返されるのはなぜですか?

これは私のコードから抽象化されています。ここで不可欠なものが欠落している場合は、もう少し複雑なバージョンを提供できます。

4

3 に答える 3

7

Perl には、他の多くの言語のように "this" 変数 (暗黙的またはその他) がありませんが、メソッドにはその情報が必要です。代わりに、Perl はクラス (静的メソッド呼び出し) またはオブジェクト (インスタンス メソッド呼び出し) をメソッドの最初の引数として提供します。引数リストを評価した結果は次のとおりです。

クラス名を必要とする静的メソッドの例:

sub new {
   my ($class, %args) = @_;
   return bless(\%args, $class);
}

SomeClass->new(...);

オブジェクトを必要とするインスタンス メソッドの例:

sub as_string {
   my ($self) = @_;
   return $self->{val};
}

$some_object->as_string();

注: @_[0]andは and で@_[1]ある必要が$_[0]あり$_[1]ます。

注: プロトタイプは一般的に不適切であり、メソッド呼び出し中に無視されます。それを取り除く。

于 2012-06-14T00:44:09.907 に答える
3

からperlootutです。

メソッド呼び出しを行うとき、Perl はメソッドの呼び出し元が最初の引数として渡されるように手配します。Invocant は、矢印の左側にあるものの派手な名前です。呼び出し元は、クラス名またはオブジェクトのいずれかです。

したがって、Perl はメソッド呼び出しに対して想定されていることを実行しています。

MyPackage::Inner->InvokeMe($MyScalar)

と同じです

MyPackage::Inner::InvokeMe('MyPackage::Inner', $MyScalar)

パラメータ配列の内容を見ると、 の値である@_ことがわかります。$_[1]$MyScalar

(ちなみに、最初のパラメーターにアクセスするための構文が間違っています。$_[0]配列の 1 つの要素はスカラーであると記述する必要があります。)

于 2012-06-13T23:46:32.400 に答える
1

これが、Perl での OO の動作です。パッケージ メソッドはパッケージ名を最初の引数として受け取り、オブジェクト メソッドはオブジェクトを最初の引数として受け取ります。したがって、コンストラクターをパッケージ メソッドとして定義できます。

sub new {
    my ($class) = @_;
    bless {}, $class;
}

メソッド内でオブジェクト自体を操作できます。

sub frobnicate {
    my ($self) = @_;
    $self->_do_frob if $self->_is_frobnicable;   
}
于 2012-06-13T23:47:54.427 に答える