2

私はあまりにも長い間 Perl の世界から離れていました。子モジュールを作成し、その機能にアクセスしたいと考えています。基本的に、これらを接続してメソッドにアクセスする方法がありません。

親の例: WWW::Foo

package WWW::Foo
use strict;
use warnings;
require Exporter;
our @ISA = qw(Exporter);
our %EXPORT_TAGS = ( 'all' => [ qw( new ) ] );
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw( );
our $VERSION = '0.01';

sub new {
    my ($package) = @_;

    $package::account_name = "Paul";
    return bless({}, $package);
}

子の例: WWW::Foo::Bar

package WWW::Foo::Bar
use strict;
use warnings;
require Exporter;
our @ISA = qw(Exporter);
our %EXPORT_TAGS = ( 'all' => [ qw( new ) ] );
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw( );
our $VERSION = '0.01';

sub print_name {
    my ($package) = @_;
    # Access parent's package and do basic print.
    return;
}

スクリプト例

#!/usr/bin/perl -w
use strict;
use WWW::Foo;
use WWW::Foo::Bar;

my $foo = new WWW::Foo();
# Access WWW::Foo::Bar's print_name function
4

3 に答える 3

4

「子」の例には次の行が含まれています。

our %EXPORT_TAGS = ( 'all' => [ qw( new ) ] );

「new」という関数をエクスポートし、他の関数はエクスポートしません (例: print_name)。

ただし、関数のエクスポートは一種の「古い学校」であり、Perl コードで行うことはほとんどありません。特に、オブジェクト指向のコードを書いている場合 (そう思われます)、コンストラクターはクラス名を介して明示的に呼び出され、他のすべてのメソッドはオブジェクトを介して呼び出されるため、何もエクスポートする必要はありません。 Perl は、それらをどのパッケージで見つけるかを知っています。

次のようにコンストラクターを呼び出しています。

my $foo = new WWW::Foo();

「間接オブジェクト構文」を回避し、代わりに次のように new をクラス メソッドとして明示的に呼び出すことをお勧めします。

my $foo = WWW::Foo->new();

しばらく Perl から離れていて、OO コードを作成したい場合は、Moose を検討することを強くお勧めします。 Moose::Manualは良い出発点です。

于 2013-05-20T21:51:19.080 に答える