В файле для вашего пакета: определите приватные методы как CODE-Ref, т.е.

отаю над небольшим модулем Perl, и по какой-то причине у меня был сценарий тестового драйвера, который использовал мой новый вызов модуля, одна из функций, которые я считал закрытыми, и это было успешно. Я был удивлен, поэтому я начал поиск в Google, и я не мог найти документацию о том, как сделать частные функции в модулях Perl ...

Я видел одно место, в котором сказано ставить точку с запятой после закрывающей скобки вашей «приватной» функции, например:

sub my_private_function {
...
}; 

Я попробовал это, но мой драйверный сценарий все еще мог получить доступ к функции, которую я хотел быть закрытым.

Я сделаю что-то, что будет более коротким примером, но вот что я хочу:

Модуль 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;
}

Драйвер: 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");

Выход драйвера:

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!

Таким образом, я добавил точку с запятой после последней закрывающей скобки в модуле, но вывод остался прежним. Единственное, что я действительно нашел, - это добавить эту строку в качестве первой строки моей private_function:

caller eq __PACKAGE__ or die;

Но это выглядит довольно глупо. У меня нет большого опыта написания модулей на Perl, поэтому, возможно, я неправильно настраиваю свой модуль? Можно ли иметь частные функции и переменные в модулях perl?

Спасибо за помощь в обучении!

Ответы на вопрос(0)

Ваш ответ на вопрос