Perl `use` - 导入没有被调用两次?

标签 perl package perl-module

perl 基础的疑问 use
它有点类似于我的另一个问题 Perl: Two packages in same file...

考虑一个 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";

}

Module1.pm
package Module1;

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

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

1;

Module2.pm
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 文档, Module1 & Module2 中的 use INCLUDES; => BEGIN {require 'INCLUDES.pm'; 'INCLUDES'->import();} 。所以,import() 也应该在 Module1.pm 和 Module2.pm 中调用。

我希望输出如下所示,

预期输出 ??
D:\Do_analysis>Script.pl
INCLUDES imported to main
INCLUDES imported to Module1
INCLUDES imported to Module2

但是为什么执行不及预期呢?

更新

这就是我想要通过拥有 INCLUDES.pm 文件来实现的目标。

Module library

请注意: PACKAGE2 可能想要访问 PACKAGE3、PACKAGE4 等。而不是 use 分别在 PACKAGE2 内的所有模块,我想在所有其他模块中创建一个库 INCLUDESuse 它。

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

我很欣赏有关如何实现这一目标的任何想法。
谢谢!

最佳答案

如果你要搬家

use Module1;
use Module2;

下面sub import { ... } ,你会得到预期的行为。

问题是你执行 Module1.pm在编译器甚至达到 sub import 之前在 INCLUDES.pm .

Module1.pm use INCLUDES; , Perl 说“哦,它已经加载了”(响应 require )和“哦,它没有 import ”(响应 import ),因为 INCLUDES.pm 的部分会创建 import还没有编译。 Module2.pm 相同.

一般来说,如果你有一个相互包含的模块(直接或以其他方式),那么你做错了(在设计方面),你最终将不得不处理这些问题。您可能会发现 Mini-Tutorial: Mutual Use of Exporting Modules在处理这些问题时很有用。

关于Perl `use` - 导入没有被调用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17736605/

相关文章:

perl - 在 Perl 中解析带双引号的制表符分隔文件

perl - 如何在 Perl 中解析用户代理字符串?

html - 如何在单个 csh/perl/python 脚本中将 20 个 .html 文件从 Linux 传输到 Windows?

php - Laravel 在 Laravel 包中合并配置

python - 将 ScientificPython 安装为依赖项

R CMD 检查 : no visible binding for global variable ‘mypkgdata’

perl - 如何将国际化添加到我的 Perl 脚本?

xml - 如何用原始标签名称替换 XML::Simple 中的 <opt> 标签?

regex - 解析mysql :///sqlite:///URLs

linux - 如何确保仅当脚本在 Windows 上运行时才加载模块?