gpt4 book ai didi

Perl:模块在导入同一个模块时发生冲突

转载 作者:行者123 更新时间:2023-12-04 16:51:05 27 4
gpt4 key购买 nike

假设我有两个模块 A 和 Bee,每个模块都使用第三个模块 Shared。

A:

package A;
BEGIN {
use Shared;
use Bee;
}

sub new {
my ($class) = @_;
my $self = {};
bless $self, $class;
$self->B(Bee->new);
$self;
}

sub B {
my($self, $B) = @_;
$self->{b} = $B if defined $B;
$self->{b};
}

sub test {
shared_sub();
}

蜜蜂:
package Bee;

BEGIN {
use Shared;
}

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

sub test {
shared_sub();
}

1;

共享(注意它没有声明包名):
#!/usr/bin/perl
use strict;
use warnings;
BEGIN {
require Exporter;

our @ISA = qw(Exporter);
our @EXPORT_OK = qw(shared_sub);
}

sub shared_sub {
print "This is the shared sub in package '" . __PACKAGE__ . "'\n";
}

1;

从调用 A 的脚本中:
use A;
my $A = A->new;
$A->test; # This is the shared sub in package 'A'
$A->B->test; # Undefined subroutine &Bee::shared_sub called at Bee.pm line 19.

从仅调用 Bee 的脚本中:
use Bee;
my $B = Bee->new;
$B->test; # This is the shared sub in package 'Bee'

单独地,A 和 Bee 都可以毫无错误地调用 test() 方法,但是当我将 Bee 嵌套在 A 中时,突然之间,Bee 再也找不到 Shared 方法了;它不是导入到调用它的任何模块的命名空间中吗?

显而易见的答案是给 Shared 自己的包名,然后更新所有使用它的模块,但我想知道是否有办法通过更简单的解决方案来避免这样做。

最佳答案

仅使用 require (因此 use )带有模块(带有 package 的文件)。使用 do否则。如果你不这样做,你就会遇到这个问题。
require只执行一次文件,但您需要在每个使用它的模块中运行一次。

模块只执行一次,但您希望每次执行时都执行代码 use Shared;

Bee can't find the Shared method anymore

Shared从来没有任何方法。没有这样的命名空间是每个都创建的。

The obvious answer is to give Shared its own package name and then update all the modules that use it,


除了 Shared.pm 之外,您不必更新任何文件.

关于Perl:模块在导入同一个模块时发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8937532/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com