Je suis en train de travailler sur un petit module Perl et pour une raison que j'ai eu le pilote d'essai de script qui a été à l'aide de mon nouveau module appeler une des fonctions que j'ai pensé que cela pourrait être privé, et il a réussi. J'ai été surpris, j'ai donc commencé à chercher sur google et je ne pouvais pas vraiment trouver toute la documentation sur la façon de faire les fonctions privées dans les modules Perl...
J'ai vu un endroit qui a dit de mettre un point-virgule après l'accolade de fermeture de votre "privé" de la fonction, comme ceci:
sub my_private_function {
...
};
J'ai essayé, mais mon chauffeur script peut encore accéder à la fonction que je voulais être privé.
Je vais faire quelque chose qui sera plus courte, par exemple, mais voici ce que je suis après:
Module TestPrivate.pm:
package TestPrivate;
require 5.004;
use strict;
use warnings;
use Carp;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
require Exporter;
@ISA = qw(Exporter AutoLoader);
our @EXPORT_OK = qw( public_function );
our @EXPORT = qw( );
$VERSION = '0.01';
sub new {
my ( $class, %args ) = @_;
my $self = {};
bless( $self, $class );
$self->private_function("THIS SHOULD BE PRIVATE");
$self->{public_variable} = "This is public";
return $self;
}
sub public_function {
my $self = shift;
my $new_text = shift;
$self->{public_variable} = $new_text;
print "Public Variable: $self->{public_variable}\n";
print "Internal Variable: $self->{internal_variable}\n";
}
sub private_function {
my $self = shift;
my $new_text = shift;
$self->{internal_variable} = $new_text;
}
Pilote: TestPrivateDriver.pl
#!/usr/bin/perl
use strict;
use TestPrivate 'public_function';
my $foo = new TestPrivate();
$foo->public_function("Changed public variable");
$foo->private_function("I changed your private variable");
$foo->public_function("Changed public variable again");
$foo->{internal_variable} = "Yep, I changed your private variable again!";
$foo->public_function("Changed public variable the last time");
Pilote de sortie:
Public Variable: Changed public variable
Internal Variable: THIS SHOULD BE PRIVATE
Public Variable: Changed public variable again
Internal Variable: I changed your private variable
Public Variable: Changed public variable the last time
Internal Variable: Yep, I changed your private variable again!
J'ai donc ajouté un point-virgule après la dernière accolade fermante dans le module, mais le résultat est toujours le même. La seule chose que j'ai vraiment trouvé a été d'ajouter cette ligne à la première ligne de mon private_function:
caller eq __PACKAGE__ or die;
Mais qui semble assez hacky. Je n'ai pas beaucoup d'expérience dans l'écriture de modules Perl, donc peut-être que je suis en train de mon module de mal? Est-il possible d'avoir privé de variables et de fonctions dans les modules perl?
Merci de m'aider à apprendre!