1

私は Perl モジュールを作成していますが、Perl がオブジェクトをどのように処理するかについてまだ理解を深めています。これは、newオブジェクトを作成するために作成したサブであり、要素の更新に問題はありません。

sub new {
    my $class = shift;
    my ($self) = {
        name => undef
    };
    bless($self, $class);
    return $self;
}
sub get_name {
    my $self = shift;
    $self->{name} = 'Eve';
    return $self->{name};
}

モジュールを呼び出して別のファイルからアクセスするときはオブジェクトを問題なく使用できますが、モジュール コードの他の領域でオブジェクトのデータを使用したいと考えています。

だから私はこれを行うのに問題はありません:

my $new_object = new ProgramTest; # ProgramTest being the module/package
my $name = get_name();

$selfしかし、外部スクリプトからアクセスされることのない「モジュール内部」メソッドで要素を使用したいと考えています。だから私はこのようなものが欲しい:

sub get_variables {
    return (name); # I don't know how to get the name here 
    # (I plan to have other variables, too)
}

私はおそらく明らかな何かを見逃しています(解決策を見たときに自分自身を蹴ると思います)ので、どんな助けにも感謝します! 変数の値に依存する条件があるため、モジュールの残りの部分が (変更せずに) 変数を使用できるようにするために、これが必要です。

4

2 に答える 2

6

perl オブジェクトには internal/private メソッドのようなものはありません。公に使用されるべきではないメソッドはアンダースコアで開始するのが一般的な方法ですが、これは決して強制されません。moose も見てください。OO perl の面倒な作業が大幅に軽減されます。

あなたの質問に関して、以下は、あるモジュールメソッドが別のモジュールメソッドを呼び出す方法を示しています。両方ともオブジェクトデータにアクセスできます。繰り返しますが、Moose を使用することを強くお勧めします。

sub publicSub{
    my ( $self ) = @_;

    return $self->_privateSub();
}

sub _privateSub{
    my ( $self ) = @_;

    return $self->{name};
}
于 2012-10-31T13:50:59.513 に答える
5

クラス変数が必要だと思います。それらはクラスに対してグローバルであり、クラスのすべてのインスタンス (つまり、作成したすべてのオブジェクト) がそれらを見ることができます。この場合のグローバルとは、それらが最も外側の字句スコープにあることを意味するため、すべてのサブルーチンがそれらを見ることができます。

package ProgramTest;
my $everyone_can_see_this = 1; # lexical scope, but 'global' to the package

sub new {
    my $class = shift;
    my ($self) = {
        name => undef
    };
    bless($self, $class);
    return $self;
}
sub get_var {
    my $self = shift;
    return ++$everyone_can_see_this;
}

package Main;
my $o1 = ProgramTest->new;
my $o2 = ProgramTest->new;

say $o1->get_var;
say $o2->get_var;
say $o1->get_var;

__END__
2
3
4

しかし、なぜあなたがそれをしたいのかわかりません。それは意味がありません (オブジェクトカウンターが必要でない限り)。構成値に使用しないでください。そうしないと、同じクラスのさまざまな目的でオブジェクトを実際に持つことができません。

多分あなたは何か他のものを望んでいます。もしそうなら、あなたの質問を言い換えてみてください。

于 2012-10-31T13:43:46.910 に答える