سؤال

لديّ وحدة Perl (الوحدة النمطية. pm) تهيئة عدد من المتغيرات ، والتي أود استيرادها ($ var2 ، $ var3) إلى مواد فرعية إضافية قد يتم تحميلها أثناء التنفيذ.

الطريقة التي أقوم بها حاليًا بإعداد الوحدة النمطية. مساءً كما يلي:

package Module;

use warnings;
use strict;

use vars qw($SUBMODULES $VAR1 $VAR2 $VAR3);

require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw($VAR2 $VAR3);

sub new {
    my ($package) = @_;
    my $self = {};
    bless ($self, $package);
    return $self;
}

sub SubModules1 {
    my $self = shift;
    if($SUBMODULES->{'1'}) { return $SUBMODULES->{'1'}; }

    # Load & cache submodule
    require Module::SubModule1;
    $SUBMODULES->{'1'} = Module::SubModule1->new(@_);    
    return $SUBMODULES->{'1'};
}

sub SubModules2 {
    my $self = shift;
    if($SUBMODULES->{'2'}) { return $SUBMODULES->{'2'}; }

    # Load & cache submodule
    require Module::SubModule2;
    $SUBMODULES->{'2'} = Module::SubModule2->new(@_);    
    return $SUBMODULES->{'2'};
}

كل وحدة فرعية منظمة على النحو التالي:

package Module::SubModule1;

use warnings;
use strict;
use Carp;

use vars qw();

sub new {
    my ($package) = @_;
    my $self = {};
    bless ($self, $package);
    return $self;
}

أريد أن أكون قادرًا على استيراد متغيرات $ var2 و $ var3 في كل من النسيحات الفرعية دون الحاجة إلى الرجوع إليها كوحدة $ :: var2 و $ module :: var3. لقد لاحظت أن البرنامج النصي للاتصال قادر على الوصول إلى كل من المتغيرات التي قمت بتصديرها في الوحدة النمطية. pm بالموضة المطلوبة ولكن لا يزال يتعين على submodule1.pm و submodule2.pm الإشارة إلى المتغيرات على أنها من module.pm.

حاولت تحديث كل وحدة فرعية على النحو التالي الذي لم ينجح للأسف ، كنت آمل:

package Module::SubModule1;

use warnings;
use strict;
use Carp;

use vars qw($VAR2 $VAR3);

sub new {
    my ($package) = @_;
    my $self = {};
    bless ($self, $package);
    $VAR2 = $Module::VAR2;
    $VAR3 = $Module::VAR3;
    return $self;
}

واسمحوا لي أن أعرف كيف يمكنني تصدير $ var2 و $ var3 من الوحدة النمطية إلى كل وحدة فرعية. شكرا مقدما لمساعدتكم!

هل كانت مفيدة؟

المحلول

في النسيج الفرعي الخاص بك ، هل تنسى أن تقول

use Module;

؟ الدعوة use Module من حزمة أخرى (قل Module::Submodule9) سيحاول تشغيل Module::import طريقة. نظرًا لأنه ليس لديك هذه الطريقة ، فسوف يتصل بـ Exporter::import الطريقة ، وهذا هو المكان الذي يصدر فيه السحر Moduleمتغيرات في Module::Submodule9 سيحدث مساحة الاسم.


في برنامجك هناك واحد فقط Module مساحة الاسم ومثيل واحد فقط من المتغير (العالمي) $Module::VAR2. يخلق التصدير الأسماء المستعارة لهذا المتغير في مساحات الأسماء الأخرى ، بحيث يمكن الوصول إلى نفس المتغير بطرق مختلفة. جرب هذا في نص منفصل:

package Whatever;
use Module;
use strict;
use vars qw($VAR2);

$Module::VAR2 = 5;
print $Whatever::VAR2;    # should be 5.
$VAR2 = 14;               # same as $Whatever::VAR2 = 14
print $Module::VAR2;      # should be 14

نصائح أخرى

حسنًا ، هناك الطريقة السهلة:

في m.pm:

package M;

use strict;
use warnings;

#our is better than "use vars" for creating package variables
#it creates an alias to $M::foo named $foo in the current lexical scope 
our $foo = 5;

sub inM { print "$foo\n" }

1;

في m/s.pm

package M;

#creates an alias to $M::foo that will last for the entire scope,
#in this case the entire file
our $foo;

package M::S;

use strict;
use warnings;

sub inMS { print "$foo\n" }

1;

في السيناريو:

#!/usr/bin/perl

use strict;
use warnings;

use M;
use M::S;

M::inM();
M::S::inMS();

لكني أنصح ضد هذا. المتغيرات العالمية ليست ممارسة جيدة ، ومشاركة المتغيرات العالمية بين الوحدات النمطية أسوأ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top