私は小さなPerlモジュールに取り組んでおり、何らかの理由で、新しいモジュールを使用していたテストドライバースクリプトが、プライベートだと思っていた関数の1つを呼び出し、成功しました。驚いたので、グーグルを検索し始めましたが、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モジュールにプライベート関数と変数を含めることは可能ですか?
私が学ぶのを手伝ってくれてありがとう!