Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl`use`-import不会被调用两次吗?_Perl_Package_Perl Module - Fatal编程技术网

Perl`use`-import不会被调用两次吗?

Perl`use`-import不会被调用两次吗?,perl,package,perl-module,Perl,Package,Perl Module,perl基础知识中的疑问使用 这与我的另一个问题有些相似 考虑一个perl脚本: Script.pl use INCLUDES; 包括.pm package INCLUDES; use Exporter; ############# MY DOUBT STARTS HERE ############### use Module1; use Module2; ################################################## our @ISA = qw(Ex

perl基础知识中的疑问
使用

这与我的另一个问题有些相似

考虑一个perl脚本:

Script.pl

use INCLUDES;
包括.pm

package INCLUDES;
use Exporter;

############# MY DOUBT STARTS HERE ###############
use Module1;
use Module2;
##################################################

our @ISA = qw(Exporter);
our @EXPORT = qw();

sub import {

  print 'INCLUDES imported to ' . caller . "\n";

}
package Module1;

use strict;
use Exporter;
use INCLUDES;    #####=> INCLUDES.pm 'use'd

our @ISA = qw(Exporter);
our @EXPORT = qw();

1;
package Module2;

use strict;
use Exporter;
use INCLUDES;  #####=> INCLUDES.pm 'use'd

our @ISA = qw(Exporter);
our @EXPORT = ();

1;
模块1.pm

package INCLUDES;
use Exporter;

############# MY DOUBT STARTS HERE ###############
use Module1;
use Module2;
##################################################

our @ISA = qw(Exporter);
our @EXPORT = qw();

sub import {

  print 'INCLUDES imported to ' . caller . "\n";

}
package Module1;

use strict;
use Exporter;
use INCLUDES;    #####=> INCLUDES.pm 'use'd

our @ISA = qw(Exporter);
our @EXPORT = qw();

1;
package Module2;

use strict;
use Exporter;
use INCLUDES;  #####=> INCLUDES.pm 'use'd

our @ISA = qw(Exporter);
our @EXPORT = ();

1;
模块2.pm

package INCLUDES;
use Exporter;

############# MY DOUBT STARTS HERE ###############
use Module1;
use Module2;
##################################################

our @ISA = qw(Exporter);
our @EXPORT = qw();

sub import {

  print 'INCLUDES imported to ' . caller . "\n";

}
package Module1;

use strict;
use Exporter;
use INCLUDES;    #####=> INCLUDES.pm 'use'd

our @ISA = qw(Exporter);
our @EXPORT = qw();

1;
package Module2;

use strict;
use Exporter;
use INCLUDES;  #####=> INCLUDES.pm 'use'd

our @ISA = qw(Exporter);
our @EXPORT = ();

1;
输出

D:\Do_analysis>Script.pl
INCLUDES imported to main
根据perl文档,
use包括:在Module1&Module2=>
开始{require'INCLUDES.pm';'INCLUDES'->import();}
。因此,应该在Module1.pm和Module2.pm中调用
import()

我希望输出如下所示

预期产出

D:\Do_analysis>Script.pl
INCLUDES imported to main
INCLUDES imported to Module1
INCLUDES imported to Module2
但为什么执行情况不如预期

已更新

这就是我试图通过拥有INCLUDES.pm文件来实现的目标

请注意:
PACKAGE2
可能希望访问PACKAGE3、PACKAGE4等。我想创建一个库
包括
并在所有其他模块中使用它,而不是
分别使用
PACKAGE2
中的所有模块

这种方法有效吗?还是值得推荐

我很感激任何关于如何实现这一目标的想法。 谢谢

如果你要搬家

use Module1;
use Module2;
子导入{…}
下面,您将获得预期的行为


问题是在编译器到达
INCLUDES.pm
中的
sub-import
之前执行
Module1.pm

Module1.pm
使用INCLUDES时,Perl说“哦,它已经被加载了”(响应
要求
)和“哦,它没有
导入
”(响应
导入
),因为
中包含.pm的那部分本来会创建
导入
,但尚未编译。与模块2.pm相同


一般来说,如果您有一个包含彼此的模块(直接或其他),那么您就做错了(在设计方面),您将不得不处理这些问题。您可能会发现处理这些问题很有用。

模块之间存在循环依赖关系
main
使用
INCLUDES
INCLUDES
使用
Module1
Module1
使用
INCLUDES
Module2
在这里基本上是无关的,除了与
Module1
的作用相同)。如果perl做了这种幼稚的事情,这将导致无限循环(或者至少是堆栈溢出),因为每次perl试图编译
INCLUDES
,它都会导致编译
模块1
,而每次perl试图编译
模块1
,它都会导致编译
INCLUDES

由于我们不希望发生这种情况,perl必须做一些不同的事情。相反,它所做的是忽略编译已编译或正在编译的模块的任何请求。因此,事件的流程是:

  • Perl开始编译
    script.pl
    ,并进入包
    main
  • Perl看到
    使用包含,加载
    INCLUDES.pm
    ,并开始编译它
  • 在第行<代码>包装包括:,perl进入包
    包含的
  • Perl看到
    使用Module1
    ,加载
    Module1.pm
    ,并开始编译它
  • 包模块1
    行,perl输入包
    模块1
  • Perl看到
    的用法包括:,意识到它已经在编译INCLUDES.pm的过程中,并且不再尝试再次编译它
  • 由于
    的使用,包括:
    perl试图调用
    INCLUDES->import
    ,但导入方法尚未定义(我们在步骤4暂停编译
    INCLUDES
    ,开始编译
    Module1
  • 编译
    模块1
    完成,我们回到
    包含
  • Perl调用
    Module1->import
    from
    INCLUDES
  • 编译
    包括
    完成,包括
    使用模块2
    子导入的定义。Perl返回到
    main
  • main
    调用
    INCLUDES->import
    ,并打印消息
  • 编译
    script.pl
    完成
  • script.pl
    在运行时无事可做,perl退出

  • 顺便说一句,这闻起来像是糟糕的设计。在好的代码中很少需要循环模块依赖关系,而仅仅为了加载一堆其他模块(尤其是导出模块)而存在的模块也值得怀疑。看起来你正在构建一个“一大堆垃圾”的模式对我能理解。但我仍然不知道,在给定的图片中是否有其他方法来实现架构。感谢您为编译过程提供了一些启示。我已经更新了我的问题关于我想做什么。我不明白我应该在哪里做
    使用/要求