2012-10-31 2 views
1

Je crée un module Perl et je suis toujours en train de comprendre comment Perl traite les objets. C'est le new sous que j'ai écrit pour créer un objet et je n'ai pas d'éléments de mise à jour de problème:Comment accéder aux fonctions d'objet dans Perl à partir du même package

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}; 
} 

je peux utiliser l'amende objet quand je l'appelle le module et l'accès d'un autre fichier, mais je veux utiliser les données de l'objet dans d'autres zones du code du module.

J'ai donc aucun problème à faire ceci:

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

Mais je veux utiliser les $self éléments dans une méthode « module interne » qui est jamais accessible par un script extérieur. Donc, je veux avoir quelque chose comme ceci:

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

Je suis probablement manque quelque chose d'évident (je suis sûr que je vais me botter quand je vois la solution), de sorte que toute aide appréciée! Je veux ceci pour que le reste du module puisse utiliser les variables (sans changer) car il y a des conditions qui s'appuient sur leurs valeurs.

+1

Voir [Comment puis-je faire des fonctions privées dans un module Perl?] (Http://stackoverflow.com/questions/451521/how-do-i-make-private-functions-in-a-perl -module). – qqx

+0

C'est en fait très utile et explique pourquoi je continue à voir '_' utilisé dans certains endroits et pas d'autres +1 – dgBP

+1

une autre chose à apprendre" nouvelle chose "est mauvaise dans Perl: http://shadow.cat/blog/matt- s-trout/indirect-mais-encore-fatal/parmi beaucoup d'autres bons articles –

Répondre

5

Il n'existe pas de méthodes internes/privées dans les objets perl. La pratique courante consiste à lancer toutes les méthodes qui ne devraient pas être utilisées publiquement avec un trait de soulignement, mais cela n'est pas appliqué de quelque façon que ce soit. Jetez un coup d'œil à l'orignal - cela prend beaucoup de tracas sur OO Perl.

En ce qui concerne votre question ci-dessous montre comment une méthode de module peut appeler une autre méthode de module, avec les deux ayant accès aux données d'objet. Encore une fois, je vous recommande vraiment d'utiliser Moose!

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

    return $self->_privateSub(); 
} 

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

    return $self->{name}; 
} 
+0

oh intéressant - j'ai essayé de passer '$ self' autour et il n'a pas semblé faire quelque chose. Je vais jouer avec ça, merci – dgBP

+3

Le '$ self 'détient toujours l'objet béni lui-même. Si vous appelez une méthode sur un objet comme '$ obj-> do ($ stuff)' alors le '->' fait que Perl utilise '$ obj' comme premier argument du sous-objet' do', donc il a besoin de 'my ($ self, $ truc) = @ _'.Vous pouvez faire la même chose avec des méthodes internes. Notez que vous ** pourriez aussi appeler une méthode explicitement avec 'do ($ obj, $ stuff)'. Cela fonctionne, mais a l'air laid et personne ne comprendra ce que vous faites, alors ** ne le faites pas **. – simbabque

+0

+1 pour Moose. Regardez aussi [Moo] (http://p3rl.org/Moo), c'est plus léger. – simbabque

5

Je pense que vous voulez des variables de classe. Ils sont globaux à une classe et toutes les instances de la classe (c'est-à-dire tous les objets que vous avez créés) peuvent les voir. Global dans ce cas signifie qu'ils sont à la portée lexicale la plus éloignée, de sorte que tous les sous-marins peuvent les voir.

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 

Mais je ne vois pas pourquoi vous voudriez faire cela. Cela n'a aucun sens (sauf si vous voulez un compteur d'objets). Ne l'utilisez pas pour les valeurs de configuration, ou vous ne pouvez pas vraiment avoir d'objets à des fins différentes de la même classe.

Peut-être que vous voulez quelque chose d'autre. Si oui, essayez de reformuler votre question.

+0

hmm yeh, j'avais des variables de classe avant mais on m'a dit que je devrais faire un objet et le référencer. Je sais que je peux simplement les remettre dans des variables, mais cela semble être une utilisation inutile d'un objet. J'utilise les variables dans le cadre des instructions 'if' plus tard dans le module et les utilise comme paramètres pour la méthode d'un autre module, donc tout semble trop compliqué pour utiliser un objet. Merci pour votre réponse :) – dgBP

Questions connexes